summaryrefslogtreecommitdiffstats
path: root/clang/lib/ASTMatchers
diff options
context:
space:
mode:
authorStephen Kelly <steveire@gmail.com>2019-12-18 22:35:46 +0000
committerStephen Kelly <steveire@gmail.com>2019-12-20 21:13:23 +0000
commit494b1318ca77927e919bbf9a61749a58553d738c (patch)
tree48ebb91ff17410019432f322827fd77dcdd0fad6 /clang/lib/ASTMatchers
parent44b4b833ad76fc61e43473c581a557f72a4ed8f4 (diff)
downloadbcm5719-llvm-494b1318ca77927e919bbf9a61749a58553d738c.tar.gz
bcm5719-llvm-494b1318ca77927e919bbf9a61749a58553d738c.zip
Customize simplified dumping and matching of LambdaExpr
Reviewers: aaron.ballman Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D71680
Diffstat (limited to 'clang/lib/ASTMatchers')
-rw-r--r--clang/lib/ASTMatchers/ASTMatchFinder.cpp36
1 files changed, 35 insertions, 1 deletions
diff --git a/clang/lib/ASTMatchers/ASTMatchFinder.cpp b/clang/lib/ASTMatchers/ASTMatchFinder.cpp
index 8ac35d52284..2a43b4c7049 100644
--- a/clang/lib/ASTMatchers/ASTMatchFinder.cpp
+++ b/clang/lib/ASTMatchers/ASTMatchFinder.cpp
@@ -145,7 +145,9 @@ public:
ScopedIncrement ScopedDepth(&CurrentDepth);
Stmt *StmtToTraverse = StmtNode;
- if (auto *ExprNode = dyn_cast_or_null<Expr>(StmtNode))
+ if (auto *ExprNode = dyn_cast_or_null<LambdaExpr>(StmtNode))
+ StmtToTraverse = ExprNode;
+ else if (auto *ExprNode = dyn_cast_or_null<Expr>(StmtNode))
StmtToTraverse = Finder->getASTContext().traverseIgnored(ExprNode);
if (Traversal ==
ast_type_traits::TraversalKind::TK_IgnoreImplicitCastsAndParentheses) {
@@ -203,6 +205,38 @@ public:
ScopedIncrement ScopedDepth(&CurrentDepth);
return traverse(*CtorInit);
}
+ bool TraverseLambdaExpr(LambdaExpr *Node) {
+ if (!Node)
+ return true;
+ ScopedIncrement ScopedDepth(&CurrentDepth);
+
+ for (unsigned I = 0, N = Node->capture_size(); I != N; ++I) {
+ const auto *C = Node->capture_begin() + I;
+ if (!C->isExplicit())
+ continue;
+ if (Node->isInitCapture(C) && !match(*C->getCapturedVar()))
+ return false;
+ if (!match(*Node->capture_init_begin()[I]))
+ return false;
+ }
+
+ if (const auto *TPL = Node->getTemplateParameterList()) {
+ for (const auto *TP : *TPL) {
+ if (!match(*TP))
+ return false;
+ }
+ }
+
+ for (const auto *P : Node->getCallOperator()->parameters()) {
+ if (!match(*P))
+ return false;
+ }
+
+ if (!match(*Node->getBody()))
+ return false;
+
+ return false;
+ }
bool shouldVisitTemplateInstantiations() const { return true; }
bool shouldVisitImplicitCode() const { return true; }
OpenPOWER on IntegriCloud