diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index 059b467655358..6343866a5066d 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -1732,7 +1732,13 @@ class FirConverter : public Fortran::lower::AbstractConverter { Fortran::lower::SymbolBox resultSymBox = lookupSymbol(resultSym); mlir::Location loc = toLocation(); if (!resultSymBox) { - mlir::emitError(loc, "internal error when processing function return"); + // Create a dummy undefined value of the expected return type. + // This prevents improper cleanup of StatementContext, which would lead + // to a crash due to a block with no terminator. See issue #126452. + mlir::FunctionType funcType = builder->getFunction().getFunctionType(); + mlir::Type resultType = funcType.getResult(0); + mlir::Value undefResult = builder->create(loc, resultType); + genExitRoutine(false, undefResult); return; } mlir::Value resultVal = resultSymBox.match( diff --git a/flang/test/Lower/undef-func-result.f90 b/flang/test/Lower/undef-func-result.f90 new file mode 100644 index 0000000000000..e3d3e23614a53 --- /dev/null +++ b/flang/test/Lower/undef-func-result.f90 @@ -0,0 +1,7 @@ +!RUN: %flang -c %s -### 2>&1 +function s(x) result(i) +!CHECK-WARNING: Function result is never defined +integer::x +procedure():: i +end function +end