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;