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 3edcc63abd3c..2fbced0c112b 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 @@ -272,7 +272,8 @@ public class StandardInstructionVisitor extends InstructionVisitor { if (methodType == MethodCallInstruction.MethodType.CAST) { if (qualifierValue instanceof DfaConstValue) { - return factory.getConstFactory().createFromValue(castConstValue((DfaConstValue)qualifierValue), type, ((DfaConstValue)qualifierValue).getConstant()); + Object casted = TypeConversionUtil.computeCastTo(((DfaConstValue)qualifierValue).getValue(), type); + return factory.getConstFactory().createFromValue(casted, type, ((DfaConstValue)qualifierValue).getConstant()); } return qualifierValue; } @@ -283,19 +284,6 @@ public class StandardInstructionVisitor extends InstructionVisitor { return DfaUnknownValue.getInstance(); } - private static Object castConstValue(DfaConstValue constValue) { - Object o = constValue.getValue(); - if (o instanceof Double || o instanceof Float) { - double dbVal = o instanceof Double ? ((Double)o).doubleValue() : ((Float)o).doubleValue(); - // 5.0f == 5 - if (Math.floor(dbVal) != dbVal) { - return o; - } - } - - return TypeConversionUtil.computeCastTo(o, PsiType.LONG); - } - protected boolean checkNotNullable(DfaMemoryState state, DfaValue value, NullabilityProblem problem, PsiElement anchor) { diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/FloatEquality.java b/java/java-tests/testData/inspection/dataFlow/fixture/FloatEquality.java new file mode 100644 index 000000000000..62b1f980e337 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/FloatEquality.java @@ -0,0 +1,7 @@ +class Fun { + public static void main(String[] args) throws Exception { + float f = 1f; + int x = f == 1f ? 1 : 2; + } + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java index 22407dc7f661..e9bc54b2d5ce 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java @@ -182,6 +182,7 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase { public void testMethodCallFlushesField() { doTest(); } public void testUnknownFloatMayBeNaN() { doTest(); } + public void testFloatEquality() { doTest(); } public void testLastConstantConditionInAnd() { doTest(); } public void testTransientFinalField() { doTest(); }