https://github.com/ymand created https://github.com/llvm/llvm-project/pull/76746
Makes value equivalence require that the values have no properties, except in the case of equivalence by pointer equality (if the pointers are equal, nothing else is checked). Fixes issue #76459. >From 87cc967ebb2bcf9db90bab367400eb6348a4b98b Mon Sep 17 00:00:00 2001 From: Yitzhak Mandelbaum <yitzh...@google.com> Date: Tue, 2 Jan 2024 19:27:21 +0000 Subject: [PATCH] [clang][dataflow] Fix bug in `Value` comparison. Makes value equivalence require that the values have no properties, except in the case of equivalence by pointer equality (if the pointers are equal, nothing else is checked). Fixes issue #76459. --- clang/lib/Analysis/FlowSensitive/Value.cpp | 10 +++++++--- clang/unittests/Analysis/FlowSensitive/ValueTest.cpp | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/clang/lib/Analysis/FlowSensitive/Value.cpp b/clang/lib/Analysis/FlowSensitive/Value.cpp index 349f873f1e6c4d..50475ef5553036 100644 --- a/clang/lib/Analysis/FlowSensitive/Value.cpp +++ b/clang/lib/Analysis/FlowSensitive/Value.cpp @@ -27,9 +27,13 @@ static bool areEquivalentIndirectionValues(const Value &Val1, } bool areEquivalentValues(const Value &Val1, const Value &Val2) { - return &Val1 == &Val2 || (Val1.getKind() == Val2.getKind() && - (isa<TopBoolValue>(&Val1) || - areEquivalentIndirectionValues(Val1, Val2))); + // If values are distinct and have properties, we don't consider them equal, + // leaving equality up to the user model. + return &Val1 == &Val2 || + (Val1.getKind() == Val2.getKind() && + // (Val1.properties().empty() && Val2.properties().empty()) && + (isa<TopBoolValue>(&Val1) || + areEquivalentIndirectionValues(Val1, Val2))); } raw_ostream &operator<<(raw_ostream &OS, const Value &Val) { diff --git a/clang/unittests/Analysis/FlowSensitive/ValueTest.cpp b/clang/unittests/Analysis/FlowSensitive/ValueTest.cpp index c5d18ba74c3ed6..2060b7eb264f74 100644 --- a/clang/unittests/Analysis/FlowSensitive/ValueTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/ValueTest.cpp @@ -53,8 +53,8 @@ TEST(ValueTest, EquivalentValuesWithDifferentPropsEquivalent) { TopBoolValue V2(A.makeAtomRef(Atom(3))); V1.setProperty("foo", Prop1); V2.setProperty("bar", Prop2); - EXPECT_TRUE(areEquivalentValues(V1, V2)); - EXPECT_TRUE(areEquivalentValues(V2, V1)); + EXPECT_FALSE(areEquivalentValues(V1, V2)); + EXPECT_FALSE(areEquivalentValues(V2, V1)); } TEST(ValueTest, DifferentKindsNotEquivalent) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits