From a876bec99e44f0734cf6c736dcd04ae305f25ce1 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 23 Apr 2020 17:23:00 +0700 Subject: [PATCH] DfaMemoryStateImpl#applyRelationCondition: use isSubRelation to match e.g. '!=' and '<' relations Fixes IDEA-238619 Wrong warning in for-loop over float GitOrigin-RevId: 40b05cb62617bd6130852837463fc0dd061806a6 --- .../codeInspection/dataFlow/DfaMemoryStateImpl.java | 2 +- .../testData/inspection/dataFlow/fixture/FloatLoop.java | 9 +++++++++ .../java/codeInspection/DataFlowRangeAnalysisTest.java | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/FloatLoop.java 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 2b9e0c426f2e..97edc6889db9 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 @@ -722,7 +722,7 @@ public class DfaMemoryStateImpl implements DfaMemoryState { } RelationType constantRelation = getFloatingConstantRelation(leftType, rightType); if (constantRelation != null) { - return constantRelation == relationType; + return relationType.isSubRelation(constantRelation); } if (canBeNaN(leftType) || canBeNaN(rightType)) { if (dfaLeft == dfaRight && dfaLeft instanceof DfaVariableValue && !(dfaLeft.getType() instanceof PsiPrimitiveType)) { diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/FloatLoop.java b/java/java-tests/testData/inspection/dataFlow/fixture/FloatLoop.java new file mode 100644 index 000000000000..4f0d64fc7e61 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/FloatLoop.java @@ -0,0 +1,9 @@ +import java.util.*; + +public class FloatLoop { + void test() { + for(float f = 0.0f; f != 2.0f; f += 0.01f){ + System.out.println(f); + } + } +} 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 dafdfbf4137c..c89b3e636da4 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowRangeAnalysisTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowRangeAnalysisTest.java @@ -68,6 +68,7 @@ public class DataFlowRangeAnalysisTest extends DataFlowInspectionTestCase { public void testStringConcat() { doTest(); } public void testUnaryPlusMinus() { doTest(); } public void testWidenPlusInLoop() { doTest(); } + public void testFloatLoop() { doTest(); } public void testWidenMulInLoop() { doTest(); } public void testReduceBinOpOnCast() { doTest(); } public void testSuppressZeroReport() { doTest(); }