Author: Jan Voung Date: 2025-03-04T15:48:42-05:00 New Revision: d6301b218c6698ceb0db1753c8de480d37d11cf8
URL: https://github.com/llvm/llvm-project/commit/d6301b218c6698ceb0db1753c8de480d37d11cf8 DIFF: https://github.com/llvm/llvm-project/commit/d6301b218c6698ceb0db1753c8de480d37d11cf8.diff LOG: Revert "[clang][dataflow] Fix unsupported types always being equal" (#129761) Reverts llvm/llvm-project#129502 seeing new crashes around https://github.com/google/crubit/blob/859520eca82d60a169fb85cdbf648c57d0a14a99/nullability/test/smart_pointers_diagnosis.cc#L57 Would like some time to investigate. Added: Modified: clang/lib/Analysis/FlowSensitive/Transfer.cpp clang/unittests/Analysis/FlowSensitive/TransferTest.cpp Removed: ################################################################################ diff --git a/clang/lib/Analysis/FlowSensitive/Transfer.cpp b/clang/lib/Analysis/FlowSensitive/Transfer.cpp index e17a16a3b75d0..9c54eb16d2224 100644 --- a/clang/lib/Analysis/FlowSensitive/Transfer.cpp +++ b/clang/lib/Analysis/FlowSensitive/Transfer.cpp @@ -60,9 +60,7 @@ static BoolValue &evaluateBooleanEquality(const Expr &LHS, const Expr &RHS, Value *LHSValue = Env.getValue(LHS); Value *RHSValue = Env.getValue(RHS); - // When two unsupported values are compared, both are nullptr. Only supported - // values should evaluate to equal. - if (LHSValue == RHSValue && LHSValue) + if (LHSValue == RHSValue) return Env.getBoolLiteralValue(true); if (auto *LHSBool = dyn_cast_or_null<BoolValue>(LHSValue)) @@ -800,14 +798,6 @@ class TransferVisitor : public ConstStmtVisitor<TransferVisitor> { Env.setValue(*S, Env.getIntLiteralValue(S->getValue())); } - // Untyped nullptr's aren't handled by NullToPointer casts, so they need to be - // handled separately. - void VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *S) { - auto &NullPointerVal = - Env.getOrCreateNullPointerValue(S->getType()->getPointeeType()); - Env.setValue(*S, NullPointerVal); - } - void VisitParenExpr(const ParenExpr *S) { // The CFG does not contain `ParenExpr` as top-level statements in basic // blocks, however manual traversal to sub-expressions may encounter them. diff --git a/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp b/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp index f52b73dbbdc57..0f731f4532535 100644 --- a/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp @@ -4974,41 +4974,6 @@ TEST(TransferTest, IntegerLiteralEquality) { }); } -TEST(TransferTest, UnsupportedValueEquality) { - std::string Code = R"( - // An explicitly unsupported type by the framework. - enum class EC { - A, - B - }; - - void target() { - EC ec = EC::A; - - bool unsupported_eq_same = (EC::A == EC::A); - bool unsupported_eq_other = (EC::A == EC::B); - bool unsupported_eq_var = (ec == EC::B); - - (void)0; // [[p]] - } - )"; - runDataflow( - Code, - [](const llvm::StringMap<DataflowAnalysisState<NoopLattice>> &Results, - ASTContext &ASTCtx) { - const Environment &Env = getEnvironmentAtAnnotation(Results, "p"); - - // We do not model the values of unsupported types, so this - // seemingly-trivial case will not be true either. - EXPECT_TRUE(isa<AtomicBoolValue>( - getValueForDecl<BoolValue>(ASTCtx, Env, "unsupported_eq_same"))); - EXPECT_TRUE(isa<AtomicBoolValue>( - getValueForDecl<BoolValue>(ASTCtx, Env, "unsupported_eq_other"))); - EXPECT_TRUE(isa<AtomicBoolValue>( - getValueForDecl<BoolValue>(ASTCtx, Env, "unsupported_eq_var"))); - }); -} - TEST(TransferTest, CorrelatedBranches) { std::string Code = R"( void target(bool B, bool C) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits