diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt index 093c8da9aa2..5134ce34e1f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt @@ -718,8 +718,8 @@ abstract class FirDataFlowAnalyzer( tryMainBlockEnterNode.mergeIncomingFlow(shouldForkFlow = true) } - fun exitTryMainBlock(tryExpression: FirTryExpression) { - graphBuilder.exitTryMainBlock(tryExpression).mergeIncomingFlow() + fun exitTryMainBlock() { + graphBuilder.exitTryMainBlock().mergeIncomingFlow() } fun enterCatchClause(catch: FirCatch) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt index 94aad8c2570..d63bfff08ac 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt @@ -832,6 +832,9 @@ class ControlFlowGraphBuilder { val enterTryNodeBlock = createTryMainBlockEnterNode(tryExpression) addNewSimpleNode(enterTryNodeBlock) + val exitTryNodeBlock = createTryMainBlockExitNode(tryExpression) + tryMainExitNodes.push(exitTryNodeBlock) + for (catch in tryExpression.catches) { val catchNode = createCatchClauseEnterNode(catch) catchNodeStorage.push(catchNode) @@ -850,10 +853,9 @@ class ControlFlowGraphBuilder { return enterTryExpressionNode to enterTryNodeBlock } - fun exitTryMainBlock(tryExpression: FirTryExpression): TryMainBlockExitNode { + fun exitTryMainBlock(): TryMainBlockExitNode { levelCounter-- - val node = createTryMainBlockExitNode(tryExpression) - tryMainExitNodes.push(node) + val node = tryMainExitNodes.top() popAndAddEdge(node) val finallyEnterNode = finallyEnterNodes.topOrNull() // NB: Check the level to avoid adding an edge to the finally block at an upper level. @@ -1266,7 +1268,7 @@ class ControlFlowGraphBuilder { tryExitNodes.top().fir.finallyBlock == null -> { // (3)... without finally ...(4) // Either in try-main or catch. - if (tryExitNodes.size == tryMainExitNodes.size) { + if (tryMainExitNodes.top().followingNodes.isNotEmpty()) { // (4)... in catch, i.e., re-throw. exitTargetsForTry.top() } else { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt index 57fb8188b3c..fa1308db418 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt @@ -144,7 +144,7 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran tryExpression.transformAnnotations(transformer, ResolutionMode.ContextIndependent) dataFlowAnalyzer.enterTryExpression(tryExpression) tryExpression.transformTryBlock(transformer, ResolutionMode.ContextDependent) - dataFlowAnalyzer.exitTryMainBlock(tryExpression) + dataFlowAnalyzer.exitTryMainBlock() tryExpression.transformCatches(this, ResolutionMode.ContextDependent) var callCompleted = false