mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 07:26:06 +00:00
[flang] Do not finalize main program variables. (#66326)
This commit is contained in:
parent
a0ce4384a6
commit
8730fe95d8
@ -660,6 +660,11 @@ static bool needEndFinalization(const Fortran::lower::pft::Variable &var) {
|
||||
if (!var.hasSymbol())
|
||||
return false;
|
||||
const Fortran::semantics::Symbol &sym = var.getSymbol();
|
||||
const Fortran::semantics::Scope &owner = sym.owner();
|
||||
if (owner.kind() == Fortran::semantics::Scope::Kind::MainProgram) {
|
||||
// The standard does not require finalizing main program variables.
|
||||
return false;
|
||||
}
|
||||
if (!Fortran::semantics::IsPointer(sym) &&
|
||||
!Fortran::semantics::IsAllocatable(sym) &&
|
||||
!Fortran::semantics::IsDummy(sym) &&
|
||||
|
@ -248,20 +248,7 @@ end module
|
||||
program p
|
||||
use derived_type_finalization
|
||||
type(t1) :: t
|
||||
if (t%a == 10) return
|
||||
print *, 'end of program'
|
||||
end program
|
||||
|
||||
! CHECK-LABEL: func.func @_QQmain() attributes {fir.bindc_name = "p"} {
|
||||
! CHECK: %[[T:.*]] = fir.alloca !fir.type<_QMderived_type_finalizationTt1{a:i32}> {bindc_name = "t", uniq_name = "_QFEt"}
|
||||
! CHECK: cf.cond_br %{{.*}}, ^bb1, ^bb2
|
||||
! CHECK: ^bb1:
|
||||
! CHECK: %[[EMBOX:.*]] = fir.embox %[[T]] : (!fir.ref<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>
|
||||
! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[EMBOX]] : (!fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<none>
|
||||
! CHECK: %{{.*}} = fir.call @_FortranADestroy(%[[BOX_NONE]]) {{.*}} : (!fir.box<none>) -> none
|
||||
! CHECK: return
|
||||
! CHECK: ^bb2:
|
||||
! CHECK: %[[EMBOX:.*]] = fir.embox %[[T]] : (!fir.ref<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>
|
||||
! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[EMBOX]] : (!fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<none>
|
||||
! CHECK: %{{.*}} = fir.call @_FortranADestroy(%[[BOX_NONE]]) {{.*}} : (!fir.box<none>) -> none
|
||||
! CHECK: return
|
||||
! CHECK-NOT: fir.call @_FortranADestroy
|
||||
|
Loading…
x
Reference in New Issue
Block a user