diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java index 92fe226049db..fc358c798019 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java @@ -239,7 +239,8 @@ class StateMerger { List compatible = ContainerUtil.filter(statesByEq.get(createPair(var, value)), new Condition() { @Override public boolean value(DfaMemoryStateImpl state2) { - return seemCompatible(state, state2, var); + return seemCompatible(state, state2, var) && + state.getVariableState(var).withNullability(Nullness.UNKNOWN).equals(state2.getVariableState(var).withNullability(Nullness.UNKNOWN)); } }); if (compatible.isEmpty()) { diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/DontForgetInstanceofInfoWhenMerging.java b/java/java-tests/testData/inspection/dataFlow/fixture/DontForgetInstanceofInfoWhenMerging.java new file mode 100644 index 000000000000..ca2737a1bccd --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/DontForgetInstanceofInfoWhenMerging.java @@ -0,0 +1,19 @@ +class Some { + void foo() { + Object o = null; + while (equals(3)) { + if (equals(2)) { + if (o == null) { + o = new String(); + } + } + if (o == null || o instanceof String) { + System.out.println(o); + } + } + } + + +} + + diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java index ffbb6caa4c5a..e9482f500ee7 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java @@ -307,6 +307,7 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase { public void testManyDisjunctiveFieldAssignmentsInLoopNotComplex() { doTest(); } public void testVariablesDiverge() { doTest(); } + public void testDontForgetInstanceofInfoWhenMerging() { doTest(); } public void _testNullCheckBeforeInstanceof() { doTest(); } // http://youtrack.jetbrains.com/issue/IDEA-113220 }