From 686c531d3aa0f6d9b64146c9fd2dd1911c356063 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 2 Nov 2012 19:02:35 +0100 Subject: [PATCH] IDEA-94068 False negative on boolean condition always-false inspection. --- .../dataFlow/ControlFlowAnalyzer.java | 2 +- .../dataFlow/value/DfaConstValue.java | 13 +++---------- .../com/intellij/psi/util/TypeConversionUtil.java | 3 +++ .../dataFlow/fixture/ConstantDoubleComparisons.java | 11 +++++++++++ .../DataFlowInspectionFixtureTest.java | 2 ++ 5 files changed, 20 insertions(+), 11 deletions(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/ConstantDoubleComparisons.java diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index 9af352809c3b..c4eb8a206e2a 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -1003,7 +1003,7 @@ class ControlFlowAnalyzer extends JavaElementVisitor { TypeConversionUtil.isNumericType(lType) && TypeConversionUtil.isNumericType(rType); - PsiType castType = comparingPrimitiveNumerics ? PsiType.LONG : type; + PsiType castType = comparingPrimitiveNumerics ? TypeConversionUtil.isFloatOrDoubleType(lType) ? PsiType.DOUBLE : PsiType.LONG : type; if (!comparingRef) { generateBoxingUnboxingInstructionFor(lExpr,castType); diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/value/DfaConstValue.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/value/DfaConstValue.java index f2d11b8b296e..be0aa21442db 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/value/DfaConstValue.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/value/DfaConstValue.java @@ -77,7 +77,7 @@ public class DfaConstValue extends DfaValue { private static Boolean computeJavaLangBooleanFieldReference(final PsiVariable variable) { if (!(variable instanceof PsiField)) return null; PsiClass psiClass = ((PsiField)variable).getContainingClass(); - if (psiClass == null || !"java.lang.Boolean".equals(psiClass.getQualifiedName())) return null; + if (psiClass == null || !CommonClassNames.JAVA_LANG_BOOLEAN.equals(psiClass.getQualifiedName())) return null; @NonNls String name = variable.getName(); return "TRUE".equals(name) ? Boolean.TRUE : "FALSE".equals(name) ? Boolean.FALSE : null; } @@ -87,15 +87,8 @@ public class DfaConstValue extends DfaValue { if (value == Boolean.TRUE) return dfaTrue; if (value == Boolean.FALSE) return dfaFalse; - if (TypeConversionUtil.isNumericType(type)) { - if (PsiType.DOUBLE.equals(type) || PsiType.FLOAT.equals(type)) { - //double dbVal = type == PsiType.DOUBLE ? ((Double)value).doubleValue() : ((Float)value).doubleValue(); - //// 5.0f == 5 - //if (Math.floor(dbVal) == dbVal) value = TypeConversionUtil.computeCastTo(value, PsiType.LONG); - } - else { - value = TypeConversionUtil.computeCastTo(value, PsiType.LONG); - } + if (TypeConversionUtil.isNumericType(type) && !TypeConversionUtil.isFloatOrDoubleType(type)) { + value = TypeConversionUtil.computeCastTo(value, PsiType.LONG); } DfaConstValue instance = myValues.get(value); if (instance == null) { diff --git a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java index 45825bfeb7ad..dad757d08afc 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java @@ -388,6 +388,9 @@ public class TypeConversionUtil { return PsiType.NULL.equals(type); } + public static boolean isFloatOrDoubleType(PsiType type) { + return isFloatType(type) || isDoubleType(type); + } public static boolean isDoubleType(PsiType type) { return PsiType.DOUBLE.equals(type) || PsiType.DOUBLE.equals(PsiPrimitiveType.getUnboxedType(type)); } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ConstantDoubleComparisons.java b/java/java-tests/testData/inspection/dataFlow/fixture/ConstantDoubleComparisons.java new file mode 100644 index 000000000000..f126ac1e10e2 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ConstantDoubleComparisons.java @@ -0,0 +1,11 @@ +class Foo { + + private void foo() { + double d = Double.MIN_VALUE; + while (true) { + if (d == Double.MIN_VALUE) { + d = 0; + } + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java index 26b48acbcc94..ae2b0ca6b7db 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java @@ -130,4 +130,6 @@ public class DataFlowInspectionFixtureTest extends JavaCodeInsightFixtureTestCas doTest(); } + public void testConstantDoubleComparisons() { doTest(); } + }