From d0d9cf8e6fdf2ca616f82ed8a7bb8c2fe6c4d044 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 4 Jun 2018 11:24:57 +0700 Subject: [PATCH] Mark code like `if(x > Double.NaN)` as "always false" Fixes part of IDEA-193102 x > Double.NaN comparison should be highlighted as always false --- .../codeInspection/dataFlow/DfaMemoryStateImpl.java | 5 +---- .../testData/inspection/dataFlow/fixture/DoubleNaN.java | 8 ++++++++ 2 files changed, 9 insertions(+), 4 deletions(-) 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 b4ecf08294b0..1510e585fdc5 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 @@ -441,10 +441,7 @@ public class DfaMemoryStateImpl implements DfaMemoryState { private boolean isEffectivelyNaN(@NotNull DfaValue dfaValue) { - for (DfaValue eqClass : getEquivalentValues(dfaValue)) { - if (isNaN(eqClass)) return true; - } - return false; + return isNaN(dfaValue) || getEquivalentValues(dfaValue).stream().anyMatch(DfaMemoryStateImpl::isNaN); } List getEqClasses() { diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/DoubleNaN.java b/java/java-tests/testData/inspection/dataFlow/fixture/DoubleNaN.java index f363d23a257f..50968776eeb6 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/DoubleNaN.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/DoubleNaN.java @@ -1,4 +1,12 @@ public class DoubleNaN { + void testNanCmp(double x) { + if (x > Double.NaN) { + return; + } + boolean cmp = x > Double.NaN; // this is always false, a warning is expected + System.out.println(x > Double.NaN); // this is always false, a warning is expected + } + void test() { double x = Double.NaN; double y = Double.NaN;