[clang] b0ea279 - [ASTImport]CXXBoolLiteralExpr should be handled explicitly in statement comparation

via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 7 23:54:03 PDT 2023


Author: huqizhi
Date: 2023-09-08T14:52:14+08:00
New Revision: b0ea2790c41db65b3c283f78a5f534bc26fc6f8f

URL: https://github.com/llvm/llvm-project/commit/b0ea2790c41db65b3c283f78a5f534bc26fc6f8f
DIFF: https://github.com/llvm/llvm-project/commit/b0ea2790c41db65b3c283f78a5f534bc26fc6f8f.diff

LOG: [ASTImport]CXXBoolLiteralExpr should be handled explicitly in statement comparation

In the comparation of return statement, return value(if it is
CXXBoolLiteralExpr) should be handled explicitly, otherwise an
incorrect result would be returned.

Reviewed By: steakhal, donat.nagy

Differential Revision: https://reviews.llvm.org/D159479

Added: 
    

Modified: 
    clang/lib/AST/ASTStructuralEquivalence.cpp
    clang/unittests/AST/StructuralEquivalenceTest.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/ASTStructuralEquivalence.cpp b/clang/lib/AST/ASTStructuralEquivalence.cpp
index b211e349a41299a..544420234ef0eb0 100644
--- a/clang/lib/AST/ASTStructuralEquivalence.cpp
+++ b/clang/lib/AST/ASTStructuralEquivalence.cpp
@@ -366,6 +366,10 @@ class StmtComparer {
     return true;
   }
 
+  bool IsStmtEquivalent(const CXXBoolLiteralExpr *E1, const CXXBoolLiteralExpr *E2) {
+    return E1->getValue() == E2->getValue();
+  }
+
   /// End point of the traversal chain.
   bool TraverseStmt(const Stmt *S1, const Stmt *S2) { return true; }
 

diff  --git a/clang/unittests/AST/StructuralEquivalenceTest.cpp b/clang/unittests/AST/StructuralEquivalenceTest.cpp
index 1001ce49b067396..4e9f476659b9ee6 100644
--- a/clang/unittests/AST/StructuralEquivalenceTest.cpp
+++ b/clang/unittests/AST/StructuralEquivalenceTest.cpp
@@ -1798,6 +1798,25 @@ TEST_F(StructuralEquivalenceCacheTest, SimpleNonEq) {
       TU, cxxRecordDecl(hasName("B"), unless(isImplicit())))));
 }
 
+TEST_F(StructuralEquivalenceCacheTest, ReturnStmtNonEq) {
+  auto TU = makeTuDecls(
+      R"(
+      bool x(){ return true; }
+      )",
+      R"(
+      bool x(){ return false; }
+      )",
+      Lang_CXX03);
+
+  StructuralEquivalenceContext Ctx(
+      get<0>(TU)->getASTContext(), get<1>(TU)->getASTContext(),
+      NonEquivalentDecls, StructuralEquivalenceKind::Default, false, false);
+
+  auto X = findDeclPair<FunctionDecl>(TU, functionDecl(hasName("x")));
+  EXPECT_FALSE(Ctx.IsEquivalent(X.first->getBody(), X.second->getBody()));
+
+}
+
 TEST_F(StructuralEquivalenceCacheTest, SpecialNonEq) {
   auto TU = makeTuDecls(
       R"(


        


More information about the cfe-commits mailing list