diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index 32f3698bc8a..93fbf8f10a3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -33,6 +33,7 @@ import org.jetbrains.jet.lang.resolve.calls.CallMaker; import org.jetbrains.jet.lang.resolve.calls.OverloadResolutionResults; import org.jetbrains.jet.lang.resolve.calls.OverloadResolutionResultsUtil; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; +import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowValue; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowValueFactory; import org.jetbrains.jet.lang.resolve.constants.*; import org.jetbrains.jet.lang.resolve.constants.StringValue; @@ -784,6 +785,10 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { if (isKnownToBeNotNull(baseExpression, context)) { context.trace.report(UNNECESSARY_NOT_NULL_ASSERTION.on(operationSign, type)); } + else { + DataFlowValue value = DataFlowValueFactory.INSTANCE.createDataFlowValue(baseExpression, type, context.trace.getBindingContext()); + dataFlowInfo = dataFlowInfo.disequate(value, DataFlowValue.NULL); + } return DataFlowUtils.checkType(TypeUtils.makeNotNullable(type), expression, context, dataFlowInfo); } diff --git a/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt2164.jet b/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt2164.jet new file mode 100644 index 00000000000..79029f1165a --- /dev/null +++ b/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt2164.jet @@ -0,0 +1,38 @@ +//KT-2164 !! does not propagate nullability information +package kt2164 + +fun foo(x: Int): Int = x + 1 + +fun main(args : Array) { + val x: Int? = null + + foo(x) + + if (x != null) { + foo(x) + foo(x!!) + foo(x) + } + + foo(x) + + if (x != null) { + foo(x) + foo(x!!) + foo(x) + } else { + foo(x) + foo(x!!) + foo(x) + } + + foo(x) + foo(x!!) + foo(x) + + val y: Int? = null + y!! + y!! + foo(y) + foo(y!!) +}