diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java index c70bf120bc66..c4b86c16ddd4 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java @@ -269,7 +269,8 @@ public class DfaMemoryStateImpl implements DfaMemoryState { private DfaValue handleFlush(DfaVariableValue flushed, DfaValue value) { if (value instanceof DfaVariableValue && (value == flushed || myFactory.getVarFactory().getAllQualifiedBy(flushed).contains(value))) { - Nullness nullability = isNotNull(value) ? Nullness.NOT_NULL : ((DfaVariableValue)value).getInherentNullability(); + Nullness nullability = isNotNull(value) ? Nullness.NOT_NULL : + isUnknownState(value) ? Nullness.UNKNOWN : ((DfaVariableValue)value).getInherentNullability(); return myFactory.createTypeValue(((DfaVariableValue)value).getVariableType(), nullability); } return value; diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/NullableGetterInLoop.java b/java/java-tests/testData/inspection/dataFlow/fixture/NullableGetterInLoop.java new file mode 100644 index 000000000000..e5494670df00 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/NullableGetterInLoop.java @@ -0,0 +1,27 @@ +import org.jetbrains.annotations.*; + +// IDEA-172844 +abstract class SimpleClass { + + @Nullable + protected MyType findSelfOrInnerByNonQualifiedName() { + MyType nearestOuter = getOwnerParentOfType(MyType.class); + if (nearestOuter != null) { + MyType currentOuter = nearestOuter; + while (currentOuter.getOuterClass() != null) { // False positive error here + currentOuter = currentOuter.getOuterClass(); + } + } + + return null; + } + + @Nullable + abstract MyType getOwnerParentOfType(Class apexPsiTypeDeclarationClass); + + static abstract class MyType { + + @Nullable + abstract MyType getOuterClass(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java index bcd2171cecb1..bf758fbb0076 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java @@ -583,4 +583,5 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase { public void testLessThanRelations() { doTest(); } public void testAdvancedArrayAccess() { doTest(); } public void testNullabilityBasics() { doTest(); } + public void testNullableGetterInLoop() { doTest(); } }