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 f0e917e6dfbe..32ab7bdf9cb9 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 @@ -59,6 +59,7 @@ public class StandardInstructionVisitor extends InstructionVisitor { } if (dfaSource == dfaDest) { memState.push(dfaDest); + flushArrayOnUnknownAssignment(instruction, runner.getFactory(), dfaDest, memState); return nextInstruction(instruction, runner, memState); } if (!(dfaDest instanceof DfaVariableValue && diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/TwoArraysDiff.java b/java/java-tests/testData/inspection/dataFlow/fixture/TwoArraysDiff.java new file mode 100644 index 000000000000..b60afdba15dd --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/TwoArraysDiff.java @@ -0,0 +1,26 @@ +public class TwoArraysDiff { + public void test(Iterable net) { + final int size = 3; + final double[] d1 = new double[size]; + int count = 0; + for (String s : net) { + d1[count++] = calculate(); + } + final double[] d2 = new double[size]; + count = 0; + for (String s : net) { + d2[count++] = calculate(); + } + for (int i = 0; i < size; i++) { + assertTrue(d2[i] < d1[i]); + } + } + + static void assertTrue(boolean b) { + if (!b) { + throw new AssertionError(); + } + } + + native double calculate(); +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowRangeAnalysisTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowRangeAnalysisTest.java index 9f39eaec03f0..85d568dda6a7 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowRangeAnalysisTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowRangeAnalysisTest.java @@ -57,4 +57,5 @@ public class DataFlowRangeAnalysisTest extends DataFlowInspectionTestCase { public void testBoxedRanges() { doTest(); } public void testLongRangeDiff() { doTest(); } public void testAlgebraic() { doTest(); } + public void testTwoArraysDiff() { doTest(); } }