Make flow condition implications regardless of is_known properties.
Whether a type was annotated to be null/nonnull or not, if we have compared it to nullptr, we can use that information in the flow conditions of the affected blocks. The is_known property doesn't make the comparison less valid.
PiperOrigin-RevId: 539115610
diff --git a/nullability/pointer_nullability_analysis.cc b/nullability/pointer_nullability_analysis.cc
index a2f9690..4343199 100644
--- a/nullability/pointer_nullability_analysis.cc
+++ b/nullability/pointer_nullability_analysis.cc
@@ -297,24 +297,20 @@
if (!LHS || !RHS) return;
- auto [LHSKnown, LHSNull] = getPointerNullState(*LHS);
- auto [RHSKnown, RHSNull] = getPointerNullState(*RHS);
- auto& LHSKnownNotNull =
- State.Env.makeAnd(LHSKnown, State.Env.makeNot(LHSNull));
- auto& RHSKnownNotNull =
- State.Env.makeAnd(RHSKnown, State.Env.makeNot(RHSNull));
- auto& LHSKnownNull = State.Env.makeAnd(LHSKnown, LHSNull);
- auto& RHSKnownNull = State.Env.makeAnd(RHSKnown, RHSNull);
+ auto& LHSNull = getPointerNullState(*LHS).second;
+ auto& RHSNull = getPointerNullState(*RHS).second;
+ auto& LHSNotNull = State.Env.makeNot(LHSNull);
+ auto& RHSNotNull = State.Env.makeNot(RHSNull);
// nullptr == nullptr
State.Env.addToFlowCondition(State.Env.makeImplication(
- State.Env.makeAnd(LHSKnownNull, RHSKnownNull), PointerEQ));
+ State.Env.makeAnd(LHSNull, RHSNull), PointerEQ));
// nullptr != notnull
State.Env.addToFlowCondition(State.Env.makeImplication(
- State.Env.makeAnd(LHSKnownNull, RHSKnownNotNull), PointerNE));
+ State.Env.makeAnd(LHSNull, RHSNotNull), PointerNE));
// notnull != nullptr
State.Env.addToFlowCondition(State.Env.makeImplication(
- State.Env.makeAnd(LHSKnownNotNull, RHSKnownNull), PointerNE));
+ State.Env.makeAnd(LHSNotNull, RHSNull), PointerNE));
}
void transferFlowSensitiveNullCheckImplicitCastPtrToBool(