diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PatternMatchingTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PatternMatchingTypingVisitor.java index e46728049ed..b12b0b1123d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PatternMatchingTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PatternMatchingTypingVisitor.java @@ -143,15 +143,17 @@ public class PatternMatchingTypingVisitor extends ExpressionTypingVisitor { } DataFlowInfos infos = null; + ExpressionTypingContext contextForCondition = context; for (JetWhenCondition condition : whenEntry.getConditions()) { DataFlowInfos conditionInfos = checkWhenCondition(subjectExpression, subjectType, condition, - context, subjectDataFlowValue); + contextForCondition, subjectDataFlowValue); if (infos != null) { infos = new DataFlowInfos(infos.thenInfo.or(conditionInfos.thenInfo), infos.elseInfo.and(conditionInfos.elseInfo)); } else { infos = conditionInfos; } + contextForCondition = contextForCondition.replaceDataFlowInfo(conditionInfos.elseInfo); } return infos != null ? infos : new DataFlowInfos(context.dataFlowInfo); } diff --git a/compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt6819.kt b/compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt6819.kt new file mode 100644 index 00000000000..d32ad6dbb29 --- /dev/null +++ b/compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt6819.kt @@ -0,0 +1,7 @@ +public fun test(o: String?): Boolean { + return when { + // Data flow info should propagate from o == null to o.length() + o == null, o.length() == 0 -> false + else -> true + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt6819.txt b/compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt6819.txt new file mode 100644 index 00000000000..5b4901bc4ba --- /dev/null +++ b/compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt6819.txt @@ -0,0 +1,3 @@ +package + +public fun test(/*0*/ o: kotlin.String?): kotlin.Boolean diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 0f6e9994c57..b8e717880d9 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -11412,6 +11412,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt5907var.kt"); doTest(fileName); } + + @TestMetadata("kt6819.kt") + public void testKt6819() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt6819.kt"); + doTest(fileName); + } } }