Author: Sunrise Date: 2023-09-21T14:55:19+08:00 New Revision: 3542168be0a0f3bb88b5298e4463c185a69f0357
URL: https://github.com/llvm/llvm-project/commit/3542168be0a0f3bb88b5298e4463c185a69f0357 DIFF: https://github.com/llvm/llvm-project/commit/3542168be0a0f3bb88b5298e4463c185a69f0357.diff LOG: [clang][AST] fix lack comparison of declRefExpr in ASTStructuralEquivalence (#66041) Fixed #66047 Before fix,the following testcase expected true. ```cpp TEST_F(StructuralEquivalenceStmtTest, DeclRefENoEq) { std::string Prefix = "enum Test { AAA, BBB };"; auto t = makeStmts( Prefix + "void foo(int i) {if (i > 0) {i = AAA;} else {i = BBB;}}", Prefix + "void foo(int i) {if (i > 0) {i = BBB;} else {i = AAA;}}", Lang_CXX03, ifStmt()); EXPECT_FALSE(testStructuralMatch(t)); // EXPECT_TRUE } ``` Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/AST/ASTStructuralEquivalence.cpp clang/unittests/AST/StructuralEquivalenceTest.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 3c661b8a08fe36d..77aad0c9731bea1 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -244,6 +244,8 @@ Bug Fixes in This Version (`#65156 <https://github.com/llvm/llvm-project/issues/65156>`_) - Clang no longer considers the loss of ``__unaligned`` qualifier from objects as an invalid conversion during method function overload resolution. +- Fix lack of comparison of declRefExpr in ASTStructuralEquivalence + (`#66047 <https://github.com/llvm/llvm-project/issues/66047>`_) - Fix parser crash when dealing with ill-formed objective C++ header code. Fixes (`#64836 <https://github.com/llvm/llvm-project/issues/64836>`_) - Clang now allows an ``_Atomic`` qualified integer in a switch statement. Fixes diff --git a/clang/lib/AST/ASTStructuralEquivalence.cpp b/clang/lib/AST/ASTStructuralEquivalence.cpp index 45c2a8a1263ddc8..5b98d14dd3d9104 100644 --- a/clang/lib/AST/ASTStructuralEquivalence.cpp +++ b/clang/lib/AST/ASTStructuralEquivalence.cpp @@ -214,6 +214,15 @@ class StmtComparer { return E1->size() == E2->size(); } + bool IsStmtEquivalent(const DeclRefExpr *DRE1, const DeclRefExpr *DRE2) { + const ValueDecl *Decl1 = DRE1->getDecl(); + const ValueDecl *Decl2 = DRE2->getDecl(); + if (!Decl1 || !Decl2) + return false; + return IsStructurallyEquivalent(Context, const_cast<ValueDecl *>(Decl1), + const_cast<ValueDecl *>(Decl2)); + } + bool IsStmtEquivalent(const DependentScopeDeclRefExpr *DE1, const DependentScopeDeclRefExpr *DE2) { if (!IsStructurallyEquivalent(Context, DE1->getDeclName(), diff --git a/clang/unittests/AST/StructuralEquivalenceTest.cpp b/clang/unittests/AST/StructuralEquivalenceTest.cpp index ae4af8b114c7f15..44d950cfe758f14 100644 --- a/clang/unittests/AST/StructuralEquivalenceTest.cpp +++ b/clang/unittests/AST/StructuralEquivalenceTest.cpp @@ -2393,5 +2393,14 @@ TEST_F(StructuralEquivalenceCacheTest, GotoStmtNoEq) { EXPECT_FALSE(testStructuralMatch(S)); } +TEST_F(StructuralEquivalenceStmtTest, DeclRefExpr) { + std::string Prefix = "enum Test { AAA, BBB };"; + auto t = makeStmts( + Prefix + "void foo(int i) {if (i > 0) {i = AAA;} else {i = BBB;}}", + Prefix + "void foo(int i) {if (i > 0) {i = BBB;} else {i = AAA;}}", + Lang_CXX03, ifStmt()); + EXPECT_FALSE(testStructuralMatch(t)); +} + } // end namespace ast_matchers } // end namespace clang _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits