From 81412297446a21adcd3053c616bd89339d5b4a5c Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Wed, 5 Dec 2012 13:03:47 +0400 Subject: [PATCH] added edge from try start to error through finally block KT-2845 Wrong cf-analysys for variable initialization in try..finally #KT-2845 fixed todo: some errors now are reported for several times (each time when analyzing finally block) --- .../jet/lang/cfg/JetControlFlowProcessor.java | 13 +++++++++++++ .../tests/controlFlowAnalysis/kt2845.kt | 17 +++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 5 +++++ 3 files changed, 35 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/controlFlowAnalysis/kt2845.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index b15478cc1de..068a4552f39 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -371,6 +371,11 @@ public class JetControlFlowProcessor { onException = builder.createUnboundLabel(); builder.nondeterministicJump(onException); } + Label onExceptionToFinallyBlock = null; + if (finallyBlock != null) { + onExceptionToFinallyBlock = builder.createUnboundLabel(); + builder.nondeterministicJump(onExceptionToFinallyBlock); + } value(expression.getTryBlock(), inCondition); if (hasCatches) { @@ -414,6 +419,14 @@ public class JetControlFlowProcessor { if (finallyBlock != null) { builder.exitTryFinally(); + + Label skipFinallyToErrorBlock = builder.createUnboundLabel(); + builder.jump(skipFinallyToErrorBlock); + builder.bindLabel(onExceptionToFinallyBlock); + value(finallyBlock.getFinalExpression(), inCondition); + builder.jumpToError(); + builder.bindLabel(skipFinallyToErrorBlock); + value(finallyBlock.getFinalExpression(), inCondition); } builder.stopAllowDead(); diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt2845.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt2845.kt new file mode 100644 index 00000000000..82582f733a3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt2845.kt @@ -0,0 +1,17 @@ +//KT-2845 Wrong cf-analysys for variable initialization in try..finally +package h + +import java.util.ArrayList + +private fun doTest() : Int { + var list : MutableList? ; + try { + list = ArrayList() + list?.add(3) + return 0 ; + } + finally { + if(list != null) { // Must be an ERROR + } + } +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 95b9242dec8..bb7c94980fa 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -894,6 +894,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/kt2330.kt"); } + @TestMetadata("kt2845.kt") + public void testKt2845() throws Exception { + doTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/kt2845.kt"); + } + @TestMetadata("kt510.kt") public void testKt510() throws Exception { doTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/kt510.kt");