diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index 492176f2e1305..9033ab8026c22 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -950,7 +950,6 @@ class FirConverter : public Fortran::lower::AbstractConverter { if (blockIsUnterminated()) builder->create(toLocation()); } - void genFIR(const Fortran::parser::EndProgramStmt &) { genExitRoutine(); } /// END of procedure-like constructs /// @@ -3059,6 +3058,7 @@ class FirConverter : public Fortran::lower::AbstractConverter { getEval().getOwningProcedure(); assert(funit && "not inside main program, function or subroutine"); if (funit->isMainProgram()) { + bridge.fctCtx().finalizeAndKeep(); genExitRoutine(); return; } @@ -3114,6 +3114,7 @@ class FirConverter : public Fortran::lower::AbstractConverter { void genFIR(const Fortran::parser::EndFunctionStmt &) {} // nop void genFIR(const Fortran::parser::EndIfStmt &) {} // nop void genFIR(const Fortran::parser::EndMpSubprogramStmt &) {} // nop + void genFIR(const Fortran::parser::EndProgramStmt &) {} // nop void genFIR(const Fortran::parser::EndSelectStmt &) {} // nop void genFIR(const Fortran::parser::EndSubroutineStmt &) {} // nop void genFIR(const Fortran::parser::EntryStmt &) {} // nop @@ -3438,16 +3439,8 @@ class FirConverter : public Fortran::lower::AbstractConverter { void endNewFunction(Fortran::lower::pft::FunctionLikeUnit &funit) { setCurrentPosition(Fortran::lower::pft::stmtSourceLoc(funit.endStmt)); if (funit.isMainProgram()) { - if (!blockIsUnterminated()) { - auto insertPt = builder->saveInsertionPoint(); - mlir::Block *currentBlock = builder->getBlock(); - builder->setInsertionPoint(¤tBlock->back()); - bridge.fctCtx().finalizeAndPop(); - builder->restoreInsertionPoint(insertPt); - } else { - bridge.fctCtx().finalizeAndPop(); - genExitRoutine(); - } + bridge.fctCtx().finalizeAndPop(); + genExitRoutine(); } else { genFIRProcedureExit(funit, funit.getSubprogramSymbol()); } diff --git a/flang/test/Lower/derived-type-finalization.f90 b/flang/test/Lower/derived-type-finalization.f90 index 6dcf7cf41ffd9..fae1cdc32bf86 100644 --- a/flang/test/Lower/derived-type-finalization.f90 +++ b/flang/test/Lower/derived-type-finalization.f90 @@ -153,12 +153,20 @@ subroutine test_finalize_intent_out(t) 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() { ! CHECK: %[[T:.*]] = fir.alloca !fir.type<_QMderived_type_finalizationTt1{a:i32}> {bindc_name = "t", uniq_name = "_QFEt"} -! CHECK: %[[EMBOX:.*]] = fir.embox %[[T]] : (!fir.ref>) -> !fir.box> -! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[EMBOX]] : (!fir.box>) -> !fir.box -! CHECK: %{{.*}} = fir.call @_FortranADestroy(%[[BOX_NONE]]) {{.*}} : (!fir.box) -> none -! CHECK: return +! CHECK: cf.cond_br %{{.*}}, ^bb1, ^bb2 +! CHECK: ^bb1: +! CHECK: %[[EMBOX:.*]] = fir.embox %[[T]] : (!fir.ref>) -> !fir.box> +! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[EMBOX]] : (!fir.box>) -> !fir.box +! CHECK: %{{.*}} = fir.call @_FortranADestroy(%[[BOX_NONE]]) {{.*}} : (!fir.box) -> none +! CHECK: return +! CHECK: ^bb2: +! CHECK: %[[EMBOX:.*]] = fir.embox %[[T]] : (!fir.ref>) -> !fir.box> +! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[EMBOX]] : (!fir.box>) -> !fir.box +! CHECK: %{{.*}} = fir.call @_FortranADestroy(%[[BOX_NONE]]) {{.*}} : (!fir.box) -> none +! CHECK: return