[clang] 9e5fc57 - [ASTMatchers] Ignore parts of BindingDecls which are not spelled in source
Stephen Kelly via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 2 06:23:32 PST 2021
Author: Stephen Kelly
Date: 2021-02-02T14:23:13Z
New Revision: 9e5fc578f99aaa3f01374d3f09fda75fa7d0239e
URL: https://github.com/llvm/llvm-project/commit/9e5fc578f99aaa3f01374d3f09fda75fa7d0239e
DIFF: https://github.com/llvm/llvm-project/commit/9e5fc578f99aaa3f01374d3f09fda75fa7d0239e.diff
LOG: [ASTMatchers] Ignore parts of BindingDecls which are not spelled in source
Differential Revision: https://reviews.llvm.org/D95740
Added:
Modified:
clang/include/clang/AST/ASTNodeTraverser.h
clang/lib/ASTMatchers/ASTMatchFinder.cpp
clang/unittests/AST/ASTTraverserTest.cpp
clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/AST/ASTNodeTraverser.h b/clang/include/clang/AST/ASTNodeTraverser.h
index bb5b0c73f028..c4f0355b352e 100644
--- a/clang/include/clang/AST/ASTNodeTraverser.h
+++ b/clang/include/clang/AST/ASTNodeTraverser.h
@@ -438,6 +438,8 @@ class ASTNodeTraverser
}
void VisitBindingDecl(const BindingDecl *D) {
+ if (Traversal == TK_IgnoreUnlessSpelledInSource)
+ return;
if (const auto *E = D->getBinding())
Visit(E);
}
diff --git a/clang/lib/ASTMatchers/ASTMatchFinder.cpp b/clang/lib/ASTMatchers/ASTMatchFinder.cpp
index 69957a952d17..58e69bb29df6 100644
--- a/clang/lib/ASTMatchers/ASTMatchFinder.cpp
+++ b/clang/lib/ASTMatchers/ASTMatchFinder.cpp
@@ -1216,6 +1216,8 @@ bool MatchASTVisitor::TraverseDecl(Decl *DeclNode) {
ScopedChildren = true;
if (FD->isTemplateInstantiation())
ScopedTraversal = true;
+ } else if (isa<BindingDecl>(DeclNode)) {
+ ScopedChildren = true;
}
ASTNodeNotSpelledInSourceScope RAII1(this, ScopedTraversal);
diff --git a/clang/unittests/AST/ASTTraverserTest.cpp b/clang/unittests/AST/ASTTraverserTest.cpp
index 94b9572ad50d..d633f90b57d2 100644
--- a/clang/unittests/AST/ASTTraverserTest.cpp
+++ b/clang/unittests/AST/ASTTraverserTest.cpp
@@ -1148,6 +1148,15 @@ void callDefaultArg()
{
hasDefaultArg(42);
}
+
+void decomposition()
+{
+ int arr[3];
+ auto &[f, s, t] = arr;
+
+ f = 42;
+}
+
)cpp",
{"-std=c++20"});
@@ -1443,6 +1452,46 @@ CallExpr
CallExpr
|-DeclRefExpr 'hasDefaultArg'
`-IntegerLiteral
+)cpp");
+ }
+
+ {
+ auto FN = ast_matchers::match(
+ functionDecl(hasName("decomposition"),
+ hasDescendant(decompositionDecl().bind("decomp"))),
+ AST2->getASTContext());
+ EXPECT_EQ(FN.size(), 1u);
+
+ EXPECT_EQ(
+ dumpASTString(TK_AsIs, FN[0].getNodeAs<DecompositionDecl>("decomp")),
+ R"cpp(
+DecompositionDecl ''
+|-DeclRefExpr 'arr'
+|-BindingDecl 'f'
+| `-ArraySubscriptExpr
+| |-ImplicitCastExpr
+| | `-DeclRefExpr ''
+| `-IntegerLiteral
+|-BindingDecl 's'
+| `-ArraySubscriptExpr
+| |-ImplicitCastExpr
+| | `-DeclRefExpr ''
+| `-IntegerLiteral
+`-BindingDecl 't'
+ `-ArraySubscriptExpr
+ |-ImplicitCastExpr
+ | `-DeclRefExpr ''
+ `-IntegerLiteral
+)cpp");
+
+ EXPECT_EQ(dumpASTString(TK_IgnoreUnlessSpelledInSource,
+ FN[0].getNodeAs<DecompositionDecl>("decomp")),
+ R"cpp(
+DecompositionDecl ''
+|-DeclRefExpr 'arr'
+|-BindingDecl 'f'
+|-BindingDecl 's'
+`-BindingDecl 't'
)cpp");
}
}
diff --git a/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
index 06c2bbc29e5c..b756cf815aaf 100644
--- a/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
+++ b/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
@@ -2591,6 +2591,48 @@ B func1() { return 42; }
Code, traverse(TK_IgnoreUnlessSpelledInSource, M),
std::make_unique<VerifyIdIsBoundTo<Expr>>("allExprs", 1)));
}
+
+ Code = R"cpp(
+void foo()
+{
+ int arr[3];
+ auto &[f, s, t] = arr;
+
+ f = 42;
+}
+ )cpp";
+ {
+ auto M = bindingDecl(hasName("f"));
+ EXPECT_TRUE(
+ matchesConditionally(Code, traverse(TK_AsIs, M), true, {"-std=c++17"}));
+ EXPECT_TRUE(
+ matchesConditionally(Code, traverse(TK_IgnoreUnlessSpelledInSource, M),
+ true, {"-std=c++17"}));
+ }
+ {
+ auto M = bindingDecl(hasName("f"), has(expr()));
+ EXPECT_TRUE(
+ matchesConditionally(Code, traverse(TK_AsIs, M), true, {"-std=c++17"}));
+ EXPECT_FALSE(
+ matchesConditionally(Code, traverse(TK_IgnoreUnlessSpelledInSource, M),
+ true, {"-std=c++17"}));
+ }
+ {
+ auto M = integerLiteral(hasAncestor(bindingDecl(hasName("f"))));
+ EXPECT_TRUE(
+ matchesConditionally(Code, traverse(TK_AsIs, M), true, {"-std=c++17"}));
+ EXPECT_FALSE(
+ matchesConditionally(Code, traverse(TK_IgnoreUnlessSpelledInSource, M),
+ true, {"-std=c++17"}));
+ }
+ {
+ auto M = declRefExpr(hasAncestor(bindingDecl(hasName("f"))));
+ EXPECT_TRUE(
+ matchesConditionally(Code, traverse(TK_AsIs, M), true, {"-std=c++17"}));
+ EXPECT_FALSE(
+ matchesConditionally(Code, traverse(TK_IgnoreUnlessSpelledInSource, M),
+ true, {"-std=c++17"}));
+ }
}
TEST(Traversal, traverseNoImplicit) {
More information about the cfe-commits
mailing list