From 0b1c87a812303ffcb486350bcf749cfc23dba04c Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 13 Nov 2012 18:38:21 +0400 Subject: [PATCH] Retain data flow info after conditions in do-while statements --- .../ControlStructureTypingVisitor.java | 4 ++-- .../dataFlowInfoTraversal/DoWhileCondition.kt | 16 ++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 5 +++++ 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/dataFlowInfoTraversal/DoWhileCondition.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java index f79fd618463..1c1372cc39d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java @@ -236,10 +236,10 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { context.expressionTypingServices.getBlockReturnedTypeWithWritableScope(writableScope, block, CoercionStrategy.NO_COERCION, context, context.trace); } JetExpression condition = expression.getCondition(); - checkCondition(conditionScope, condition, context); + DataFlowInfo conditionDataFlowInfo = checkCondition(conditionScope, condition, context); DataFlowInfo dataFlowInfo; if (!containsBreak(expression, context)) { - dataFlowInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, false, context); + dataFlowInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, false, context).and(conditionDataFlowInfo); } else { dataFlowInfo = context.dataFlowInfo; diff --git a/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/DoWhileCondition.kt b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/DoWhileCondition.kt new file mode 100644 index 00000000000..9b69655cacf --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/DoWhileCondition.kt @@ -0,0 +1,16 @@ +fun simpleDoWhile(x: Int?, var y: Int) { + do { + x : Int? + y++ + } while (x!! == y) + x : Int +} + +fun doWhileWithBreak(x: Int?, var y: Int) { + do { + x : Int? + y++ + if (y > 0) break + } while (x!! == y) + x : Int +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index c6b78e6efb4..83274659366 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -1211,6 +1211,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/DoWhile.kt"); } + @TestMetadata("DoWhileCondition.kt") + public void testDoWhileCondition() throws Exception { + doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/DoWhileCondition.kt"); + } + @TestMetadata("Elvis.kt") public void testElvis() throws Exception { doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/Elvis.kt");