aboutsummaryrefslogtreecommitdiff
path: root/clang/unittests/AST/StructuralEquivalenceTest.cpp
diff options
context:
space:
mode:
authorQizhi Hu <836744285@qq.com>2024-06-12 20:04:41 +0800
committerGitHub <noreply@github.com>2024-06-12 20:04:41 +0800
commit66a9e26438cbb5c547fd348a428ef3d1e775360c (patch)
tree0b0e623d02cff600ee2e81ce5ab0178630723db3 /clang/unittests/AST/StructuralEquivalenceTest.cpp
parent575e68e571b4524d613e29d6a4f176cab8224bdd (diff)
downloadllvm-66a9e26438cbb5c547fd348a428ef3d1e775360c.zip
llvm-66a9e26438cbb5c547fd348a428ef3d1e775360c.tar.gz
llvm-66a9e26438cbb5c547fd348a428ef3d1e775360c.tar.bz2
[StructuralEquivalence] improve NTTP and CXXDependentScopeMemberExpr comparison (#95190)
improve `ASTStructuralEquivalenceTest`: 1. compare the depth and index of NTTP 2. provide comparison of `CXXDependentScopeMemberExpr` to `StmtCompare`. Co-authored-by: huqizhi <836744285@qq.com>
Diffstat (limited to 'clang/unittests/AST/StructuralEquivalenceTest.cpp')
-rw-r--r--clang/unittests/AST/StructuralEquivalenceTest.cpp57
1 files changed, 55 insertions, 2 deletions
diff --git a/clang/unittests/AST/StructuralEquivalenceTest.cpp b/clang/unittests/AST/StructuralEquivalenceTest.cpp
index 91dd717..952c83b 100644
--- a/clang/unittests/AST/StructuralEquivalenceTest.cpp
+++ b/clang/unittests/AST/StructuralEquivalenceTest.cpp
@@ -1877,6 +1877,34 @@ TEST_F(StructuralEquivalenceCacheTest, VarDeclWithDifferentStorageClassNoEq) {
EXPECT_FALSE(Ctx.IsEquivalent(Var.first, Var.second));
}
+TEST_F(StructuralEquivalenceCacheTest,
+ NonTypeTemplateParmWithDifferentPositionNoEq) {
+ auto TU = makeTuDecls(
+ R"(
+ template<int T>
+ struct A {
+ template<int U>
+ void foo() {}
+ };
+ )",
+ R"(
+ template<int U>
+ struct A {
+ template<int V, int T>
+ void foo() {}
+ };
+ )",
+ Lang_CXX03);
+
+ StructuralEquivalenceContext Ctx(
+ get<0>(TU)->getASTContext(), get<1>(TU)->getASTContext(),
+ NonEquivalentDecls, StructuralEquivalenceKind::Default, false, false);
+
+ auto NTTP = findDeclPair<NonTypeTemplateParmDecl>(
+ TU, nonTypeTemplateParmDecl(hasName("T")));
+ EXPECT_FALSE(Ctx.IsEquivalent(NTTP.first, NTTP.second));
+}
+
TEST_F(StructuralEquivalenceCacheTest, VarDeclWithInitNoEq) {
auto TU = makeTuDecls(
R"(
@@ -2441,8 +2469,7 @@ TEST_F(StructuralEquivalenceStmtTest, NonTypeTemplateParm) {
void foo(A<T, y>);
)",
Lang_CXX11);
- // FIXME: These should not match,
- EXPECT_TRUE(testStructuralMatch(t));
+ EXPECT_FALSE(testStructuralMatch(t));
}
TEST_F(StructuralEquivalenceStmtTest, UnresolvedLookupDifferentName) {
@@ -2595,5 +2622,31 @@ TEST_F(StructuralEquivalenceStmtTest, DeclRefExpr) {
EXPECT_FALSE(testStructuralMatch(t));
}
+TEST_F(StructuralEquivalenceCacheTest, CXXDependentScopeMemberExprNoEq) {
+ auto S = makeStmts(
+ R"(
+ template <class T>
+ void foo() {
+ (void)T().x;
+ }
+ struct A { int x; };
+ void bar() {
+ foo<A>();
+ }
+ )",
+ R"(
+ template <class T>
+ void foo() {
+ (void)T().y;
+ }
+ struct A { int y; };
+ void bar() {
+ foo<A>();
+ }
+ )",
+ Lang_CXX11, cxxDependentScopeMemberExpr());
+ EXPECT_FALSE(testStructuralMatch(S));
+}
+
} // end namespace ast_matchers
} // end namespace clang