[PATCH] D66538: [AST] AST structural equivalence to work internally with pairs.
Gabor Marton via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 23 04:57:56 PDT 2019
martong added a comment.
Ok.
I like this patch because it eliminates the need for checking the redeclaration chains.
Seems like it handles cycles and the simple `f(A,B)` vs `f(A,A)` cases properly too. (Not talking about caching now, probably we must remove the `NonEquivalentDecls` cache.)
I've added two new test cases, could you please add them to the patch (maybe with modifications if you find something)?
TEST_F(StructuralEquivalenceCacheTest, Cycle) {
auto Decls =
makeTuDecls(
R"(
class C;
class A { C *c; };
class B {
int i;
};
void x(A *);
void y(A *);
class C {
friend void x(A *);
friend void y(A *);
};
)",
R"(
class C;
class A { C *c; };
class B {
int i;
};
void x(A *);
void y(A *);
class C {
friend void x(A *);
friend void y(A *);
};
)", Lang_CXX);
TranslationUnitDecl *TU1 = get<0>(Decls);
TranslationUnitDecl *TU2 = get<1>(Decls);
auto *C1 = LastDeclMatcher<CXXRecordDecl>().match(
TU1, cxxRecordDecl(hasName("C"), unless(isImplicit())));
auto *C2 = LastDeclMatcher<CXXRecordDecl>().match(
TU2, cxxRecordDecl(hasName("C"), unless(isImplicit())));
llvm::DenseSet<std::pair<Decl *, Decl *>> NonEquivalentDecls;
StructuralEquivalenceContext Ctx(
C1->getASTContext(), C2->getASTContext(), NonEquivalentDecls,
StructuralEquivalenceKind::Default, false, false);
bool Eq = Ctx.IsEquivalent(C1, C2);
EXPECT_TRUE(Eq);
}
TEST_F(StructuralEquivalenceCacheTest, SimpleNonEq) {
auto Decls =
makeTuDecls(
R"(
class A {};
class B {};
void x(A, A);
)",
R"(
class A {};
class B {};
void x(A, B);
)", Lang_CXX);
TranslationUnitDecl *TU1 = get<0>(Decls);
TranslationUnitDecl *TU2 = get<1>(Decls);
auto *x1 =
FirstDeclMatcher<FunctionDecl>().match(TU1, functionDecl(hasName("x")));
auto *x2 =
FirstDeclMatcher<FunctionDecl>().match(TU2, functionDecl(hasName("x")));
llvm::DenseSet<std::pair<Decl *, Decl *>> NonEquivalentDecls;
StructuralEquivalenceContext Ctx(
x1->getASTContext(), x2->getASTContext(), NonEquivalentDecls,
StructuralEquivalenceKind::Default, false, false);
bool Eq = Ctx.IsEquivalent(x1, x2);
EXPECT_FALSE(Eq);
}
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D66538/new/
https://reviews.llvm.org/D66538
More information about the cfe-commits
mailing list