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 @@ -3847,7 +3847,8 @@ : eval.lexicalSuccessor; if (successor && blockIsUnterminated()) { if (successor->isIntermediateConstructStmt() && - successor->parentConstruct->lowerAsUnstructured()) + successor->parentConstruct->lowerAsUnstructured() && + !eval.getIf()) // Exit from an intermediate unstructured IF or SELECT construct block. genBranch(successor->parentConstruct->constructExit->block); else if (unstructuredContext && eval.isConstructStmt() && 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,24 @@ 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 + else + num = 30 + end if + ! CHECK ^bb7: // 2 preds: ^bb5, ^bb6 + end subroutine snested + ! CHECK-LABEL: main program p integer sinteger, v(10)