[clang] b8f056d - [clang][AST][ASTImporter] improve AST comparasion on VarDecl & GotoStmt (#66976)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 20 22:13:48 PDT 2023
Author: Qizhi Hu
Date: 2023-09-21T13:13:43+08:00
New Revision: b8f056de025f5047bfed5573e65a8c840dbb76d4
URL: https://github.com/llvm/llvm-project/commit/b8f056de025f5047bfed5573e65a8c840dbb76d4
DIFF: https://github.com/llvm/llvm-project/commit/b8f056de025f5047bfed5573e65a8c840dbb76d4.diff
LOG: [clang][AST][ASTImporter] improve AST comparasion on VarDecl & GotoStmt (#66976)
improve AST comparasion on VarDecl & GotoStmt:
1. VarDecl should not be ignored,
2. GotoStmt has no children, it should be handle explicitly.
Reviewed By: donat.nagy
Differential Revision: https://reviews.llvm.org/D159519
Co-authored-by: huqizhi <836744285 at qq.com>
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 544420234ef0eb0..45c2a8a1263ddc8 100644
--- a/clang/lib/AST/ASTStructuralEquivalence.cpp
+++ b/clang/lib/AST/ASTStructuralEquivalence.cpp
@@ -277,6 +277,17 @@ class StmtComparer {
bool IsStmtEquivalent(const Stmt *S1, const Stmt *S2) { return true; }
+ bool IsStmtEquivalent(const GotoStmt *S1, const GotoStmt *S2) {
+ LabelDecl *L1 = S1->getLabel();
+ LabelDecl *L2 = S2->getLabel();
+ if (!L1 || !L2)
+ return L1 == L2;
+
+ IdentifierInfo *Name1 = L1->getIdentifier();
+ IdentifierInfo *Name2 = L2->getIdentifier();
+ return ::IsStructurallyEquivalent(Name1, Name2);
+ }
+
bool IsStmtEquivalent(const SourceLocExpr *E1, const SourceLocExpr *E2) {
return E1->getIdentKind() == E2->getIdentKind();
}
@@ -1295,6 +1306,22 @@ static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
return true;
}
+static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
+ VarDecl *D1, VarDecl *D2) {
+ if (D1->getStorageClass() != D2->getStorageClass())
+ return false;
+
+ IdentifierInfo *Name1 = D1->getIdentifier();
+ IdentifierInfo *Name2 = D2->getIdentifier();
+ if (!::IsStructurallyEquivalent(Name1, Name2))
+ return false;
+
+ if (!IsStructurallyEquivalent(Context, D1->getType(), D2->getType()))
+ return false;
+
+ return IsStructurallyEquivalent(Context, D1->getInit(), D2->getInit());
+}
+
static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
FieldDecl *Field1, FieldDecl *Field2,
QualType Owner2Type) {
diff --git a/clang/unittests/AST/StructuralEquivalenceTest.cpp b/clang/unittests/AST/StructuralEquivalenceTest.cpp
index 4e9f476659b9ee6..ae4af8b114c7f15 100644
--- a/clang/unittests/AST/StructuralEquivalenceTest.cpp
+++ b/clang/unittests/AST/StructuralEquivalenceTest.cpp
@@ -1,5 +1,6 @@
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTStructuralEquivalence.h"
+#include "clang/AST/Decl.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/ASTMatchers/ASTMatchers.h"
#include "clang/Frontend/ASTUnit.h"
@@ -1801,10 +1802,10 @@ TEST_F(StructuralEquivalenceCacheTest, SimpleNonEq) {
TEST_F(StructuralEquivalenceCacheTest, ReturnStmtNonEq) {
auto TU = makeTuDecls(
R"(
- bool x(){ return true; }
+ bool x() { return true; }
)",
R"(
- bool x(){ return false; }
+ bool x() { return false; }
)",
Lang_CXX03);
@@ -1817,6 +1818,60 @@ TEST_F(StructuralEquivalenceCacheTest, ReturnStmtNonEq) {
}
+TEST_F(StructuralEquivalenceCacheTest, VarDeclNoEq) {
+ auto TU = makeTuDecls(
+ R"(
+ int p;
+ )",
+ R"(
+ int q;
+ )",
+ Lang_CXX03);
+
+ StructuralEquivalenceContext Ctx(
+ get<0>(TU)->getASTContext(), get<1>(TU)->getASTContext(),
+ NonEquivalentDecls, StructuralEquivalenceKind::Default, false, false);
+
+ auto Var = findDeclPair<VarDecl>(TU, varDecl());
+ EXPECT_FALSE(Ctx.IsEquivalent(Var.first, Var.second));
+}
+
+TEST_F(StructuralEquivalenceCacheTest, VarDeclWithDifferentStorageClassNoEq) {
+ auto TU = makeTuDecls(
+ R"(
+ int p;
+ )",
+ R"(
+ static int p;
+ )",
+ Lang_CXX03);
+
+ StructuralEquivalenceContext Ctx(
+ get<0>(TU)->getASTContext(), get<1>(TU)->getASTContext(),
+ NonEquivalentDecls, StructuralEquivalenceKind::Default, false, false);
+
+ auto Var = findDeclPair<VarDecl>(TU, varDecl());
+ EXPECT_FALSE(Ctx.IsEquivalent(Var.first, Var.second));
+}
+
+TEST_F(StructuralEquivalenceCacheTest, VarDeclWithInitNoEq) {
+ auto TU = makeTuDecls(
+ R"(
+ int p = 1;
+ )",
+ R"(
+ int p = 2;
+ )",
+ Lang_CXX03);
+
+ StructuralEquivalenceContext Ctx(
+ get<0>(TU)->getASTContext(), get<1>(TU)->getASTContext(),
+ NonEquivalentDecls, StructuralEquivalenceKind::Default, false, false);
+
+ auto Var = findDeclPair<VarDecl>(TU, varDecl());
+ EXPECT_FALSE(Ctx.IsEquivalent(Var.first, Var.second));
+}
+
TEST_F(StructuralEquivalenceCacheTest, SpecialNonEq) {
auto TU = makeTuDecls(
R"(
@@ -2320,5 +2375,23 @@ TEST_F(StructuralEquivalenceStmtTest, UnresolvedLookup) {
EXPECT_TRUE(testStructuralMatch(t));
}
+TEST_F(StructuralEquivalenceCacheTest, GotoStmtNoEq) {
+ auto S = makeStmts(
+ R"(
+ void foo() {
+ goto L1;
+ L1: foo();
+ }
+ )",
+ R"(
+ void foo() {
+ goto L2;
+ L2: foo();
+ }
+ )",
+ Lang_CXX03, gotoStmt());
+ EXPECT_FALSE(testStructuralMatch(S));
+}
+
} // end namespace ast_matchers
} // end namespace clang
More information about the cfe-commits
mailing list