Skip to content

Commit 8730fe9

Browse files
authored
[flang] Do not finalize main program variables. (#66326)
1 parent a0ce438 commit 8730fe9

File tree

2 files changed

+6
-14
lines changed

2 files changed

+6
-14
lines changed

flang/lib/Lower/ConvertVariable.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,11 @@ static bool needEndFinalization(const Fortran::lower::pft::Variable &var) {
660660
if (!var.hasSymbol())
661661
return false;
662662
const Fortran::semantics::Symbol &sym = var.getSymbol();
663+
const Fortran::semantics::Scope &owner = sym.owner();
664+
if (owner.kind() == Fortran::semantics::Scope::Kind::MainProgram) {
665+
// The standard does not require finalizing main program variables.
666+
return false;
667+
}
663668
if (!Fortran::semantics::IsPointer(sym) &&
664669
!Fortran::semantics::IsAllocatable(sym) &&
665670
!Fortran::semantics::IsDummy(sym) &&

flang/test/Lower/derived-type-finalization.f90

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -248,20 +248,7 @@ subroutine local_t4()
248248
program p
249249
use derived_type_finalization
250250
type(t1) :: t
251-
if (t%a == 10) return
252-
print *, 'end of program'
253251
end program
254252

255253
! CHECK-LABEL: func.func @_QQmain() attributes {fir.bindc_name = "p"} {
256-
! CHECK: %[[T:.*]] = fir.alloca !fir.type<_QMderived_type_finalizationTt1{a:i32}> {bindc_name = "t", uniq_name = "_QFEt"}
257-
! CHECK: cf.cond_br %{{.*}}, ^bb1, ^bb2
258-
! CHECK: ^bb1:
259-
! CHECK: %[[EMBOX:.*]] = fir.embox %[[T]] : (!fir.ref<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>
260-
! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[EMBOX]] : (!fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<none>
261-
! CHECK: %{{.*}} = fir.call @_FortranADestroy(%[[BOX_NONE]]) {{.*}} : (!fir.box<none>) -> none
262-
! CHECK: return
263-
! CHECK: ^bb2:
264-
! CHECK: %[[EMBOX:.*]] = fir.embox %[[T]] : (!fir.ref<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>
265-
! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[EMBOX]] : (!fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<none>
266-
! CHECK: %{{.*}} = fir.call @_FortranADestroy(%[[BOX_NONE]]) {{.*}} : (!fir.box<none>) -> none
267-
! CHECK: return
254+
! CHECK-NOT: fir.call @_FortranADestroy

0 commit comments

Comments
 (0)