From 1c1e8f7beb6e67c3c0d2e4a37d7342e5520b16fb Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Tue, 20 Oct 2020 15:32:49 -0700 Subject: [PATCH] FIR CFG: revise edge kind between local func node and fun enter node so that local function enter node can be visited by FIR CFA #KT-42814 Fixed --- .../fromSource/bad/callsInPlace/inLocalFunction.dot | 3 +-- .../kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt | 6 +++++- .../tests/controlFlowAnalysis/assignedInIfElse.kt | 4 ++++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inLocalFunction.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inLocalFunction.dot index 8e30780dcc7..483b886e397 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inLocalFunction.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/bad/callsInPlace/inLocalFunction.dot @@ -31,8 +31,7 @@ digraph inLocalFunction_kt { } 0 -> {1}; 1 -> {2}; - 2 -> {3}; - 2 -> {7} [color=red]; + 2 -> {7 3}; 2 -> {7} [style=dashed]; 3 -> {4}; 4 -> {5}; 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 c74db462b3f..e2f8ef632d4 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 @@ -192,7 +192,11 @@ class ControlFlowGraphBuilder { } if (previousNode != null) { - addEdge(previousNode, enterNode, preferredKind = EdgeKind.DfgForward) + if (localFunctionNode == previousNode) { + addEdge(localFunctionNode, enterNode, preferredKind = EdgeKind.Forward) + } else { + addEdge(previousNode, enterNode, preferredKind = EdgeKind.DfgForward) + } } createFunctionExitNode(function).also { diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/assignedInIfElse.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/assignedInIfElse.kt index 6d33a389ae8..1a05094aa9f 100644 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/assignedInIfElse.kt +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/assignedInIfElse.kt @@ -14,4 +14,8 @@ fun foo(arg: Boolean) { x.hashCode() } } + + fun local(): Int { + return x.hashCode() + } }