From 7253845d5f0fc3663414d889e97aed2198a44a23 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 17 Apr 2018 10:52:38 +0700 Subject: [PATCH] DfaMemoryStateImpl: fix sentinel handling --- .../dataFlow/DfaMemoryStateImpl.java | 15 ++++++++------- .../dataFlow/fixture/StreamInlining.java | 3 ++- 2 files changed, 10 insertions(+), 8 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 231fa632e906..a440db821a36 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 @@ -789,9 +789,15 @@ public class DfaMemoryStateImpl implements DfaMemoryState { private boolean applyRelationCondition(@NotNull DfaRelationValue dfaRelation) { DfaValue dfaLeft = dfaRelation.getLeftOperand(); DfaValue dfaRight = dfaRelation.getRightOperand(); - if (dfaLeft instanceof DfaUnknownValue || dfaRight instanceof DfaUnknownValue) return true; RelationType relationType = dfaRelation.getRelation(); + DfaConstValue sentinel = getFactory().getConstFactory().getSentinel(); + if (dfaLeft == sentinel || dfaRight == sentinel) { + assert relationType == RelationType.EQ || relationType == RelationType.NE; + return (dfaLeft == dfaRight) == (relationType == RelationType.EQ); + } + if (dfaLeft instanceof DfaUnknownValue || dfaRight instanceof DfaUnknownValue) return true; + LongRangeSet left = getValueFact(dfaLeft, DfaFactType.RANGE); LongRangeSet right = getValueFact(dfaRight, DfaFactType.RANGE); @@ -896,11 +902,6 @@ public class DfaMemoryStateImpl implements DfaMemoryState { return !isNegated || (dfaLeft instanceof DfaVariableValue && ((DfaVariableValue)dfaLeft).containsCalls()); } - DfaConstValue sentinel = getFactory().getConstFactory().getSentinel(); - if (dfaLeft == sentinel || dfaRight == sentinel) { - return isNegated; - } - if (isNull(dfaLeft) && isNotNull(dfaRight) || isNull(dfaRight) && isNotNull(dfaLeft)) { return isNegated; } @@ -1114,7 +1115,7 @@ public class DfaMemoryStateImpl implements DfaMemoryState { public void forceVariableFact(@NotNull DfaVariableValue var, @NotNull DfaFactType factType, @Nullable T value) { if (isUnknownState(var)) return; DfaVariableState state = getVariableState(var); - flushVariable(var); + removeEquivalenceRelations(var); setVariableState(var, state.withFact(factType, value)); updateEqClassesByState(var); } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/StreamInlining.java b/java/java-tests/testData/inspection/dataFlow/fixture/StreamInlining.java index e19052695270..30fd35113251 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/StreamInlining.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/StreamInlining.java @@ -126,7 +126,8 @@ public class StreamInlining { boolean flatMap(List list, List> ll) { System.out.println(ll.stream().flatMap(l -> l.stream()).count()); return list.stream().map(s -> s.isEmpty() ? null : s) - .flatMap(s -> Stream.of(s, s.trim()).filter(r -> r != null)) + .flatMap(s -> Stream.of(s, s.trim()) + .filter(r -> r != null)) .anyMatch(x -> x == null); }