diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -1847,8 +1847,12 @@ Fortran::lower::pft::Evaluation &eval = getEval(); Fortran::lower::StatementContext stmtCtx; pushActiveConstruct(eval, stmtCtx); - for (Fortran::lower::pft::Evaluation &e : getEval().getNestedEvaluations()) - genFIR(e); + for (Fortran::lower::pft::Evaluation &e : eval.getNestedEvaluations()) { + if (e.getIf()) + maybeStartBlock(e.block); + else + genFIR(e); + } popActiveConstruct(); } @@ -2708,7 +2712,7 @@ builder->restoreInsertionPoint(crtInsPt); ++typeGuardIdx; } else if (eval.getIf()) { - genFIR(eval); + maybeStartBlock(eval.block); if (hasLocalScope) localSymbols.popScope(); } else { diff --git a/flang/test/Lower/select-case-statement.f90 b/flang/test/Lower/select-case-statement.f90 --- a/flang/test/Lower/select-case-statement.f90 +++ b/flang/test/Lower/select-case-statement.f90 @@ -413,6 +413,27 @@ print*, array(1) end subroutine sforall + ! CHECK-LABEL: func @_QPsnested + subroutine snested(str) + character(*), optional :: str + integer :: num + + if (present(str)) then + select case (trim(str)) + case ('a') + num = 10 + case default + num = 20 + end select + ! CHECK: ^bb5: // 2 preds: ^bb3, ^bb4 + ! CHECK: fir.freemem %{{[0-9]+}} : !fir.heap> + ! CHECK: cf.br ^bb7 + else + num = 30 + end if + ! CHECK: ^bb7: // 2 preds: ^bb5, ^bb6 + end subroutine snested + ! CHECK-LABEL: main program p integer sinteger, v(10)