diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java index f11134a6ad14..0745cac3596e 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java @@ -172,6 +172,13 @@ public class StandardInstructionVisitor extends InstructionVisitor { if (arrayElementValue != DfaUnknownValue.getInstance()) { result = arrayElementValue; } + if (!(result instanceof DfaVariableValue) && array instanceof DfaVariableValue) { + for (DfaVariableValue value : ((DfaVariableValue)array).getDependentVariables().toArray(new DfaVariableValue[0])) { + if (value.getQualifier() == array) { + dropLocality(value, memState); + } + } + } pushExpressionResult(result, instruction, memState); return nextInstruction(instruction, runner, memState); } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ArrayElementLocality.java b/java/java-tests/testData/inspection/dataFlow/fixture/ArrayElementLocality.java new file mode 100644 index 000000000000..ecb2643955c9 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ArrayElementLocality.java @@ -0,0 +1,13 @@ +import java.util.Collection; +import java.util.ArrayList; + +class X { + public static void main(String[] args) { + Collection[] a = new Collection[2]; + for (int t = 0; t < 2; t++) a[t] = new ArrayList<>(); + for (int i = 0; i < 4; i++) a[i % 2].add(i); + if (a[0].isEmpty() || a[1].isEmpty()) { + System.out.println("never happens"); + } + } +} \ 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 49b0613bfc4b..e2eb927c5cb8 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java @@ -663,4 +663,5 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase { public void testNullableTernaryInConstructor() { doTest(); } public void testEqualityLongInteger() { doTest(); } public void testFieldRewrittenInInner() { doTest(); } + public void testArrayElementLocality() { doTest(); } }