summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/AST/ASTNodeTraverser.h25
-rw-r--r--clang/lib/ASTMatchers/ASTMatchFinder.cpp36
-rw-r--r--clang/unittests/AST/ASTTraverserTest.cpp119
-rw-r--r--clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp28
4 files changed, 4 insertions, 204 deletions
diff --git a/clang/include/clang/AST/ASTNodeTraverser.h b/clang/include/clang/AST/ASTNodeTraverser.h
index 9dab814b659..f097d024c9e 100644
--- a/clang/include/clang/AST/ASTNodeTraverser.h
+++ b/clang/include/clang/AST/ASTNodeTraverser.h
@@ -128,12 +128,9 @@ public:
ConstStmtVisitor<Derived>::Visit(S);
// Some statements have custom mechanisms for dumping their children.
- if (isa<DeclStmt>(S) || isa<GenericSelectionExpr>(S))
- return;
-
- if (isa<LambdaExpr>(S) &&
- Traversal == ast_type_traits::TK_IgnoreUnlessSpelledInSource)
+ if (isa<DeclStmt>(S) || isa<GenericSelectionExpr>(S)) {
return;
+ }
for (const Stmt *SubStmt : S->children())
Visit(SubStmt);
@@ -649,23 +646,7 @@ public:
}
void VisitLambdaExpr(const LambdaExpr *Node) {
- if (Traversal == ast_type_traits::TK_IgnoreUnlessSpelledInSource) {
- 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))
- Visit(C->getCapturedVar());
- else
- Visit(Node->capture_init_begin()[I]);
- }
- dumpTemplateParameters(Node->getTemplateParameterList());
- for (const auto *P : Node->getCallOperator()->parameters())
- Visit(P);
- Visit(Node->getBody());
- } else {
- return Visit(Node->getLambdaClass());
- }
+ Visit(Node->getLambdaClass());
}
void VisitSizeOfPackExpr(const SizeOfPackExpr *Node) {
diff --git a/clang/lib/ASTMatchers/ASTMatchFinder.cpp b/clang/lib/ASTMatchers/ASTMatchFinder.cpp
index 2a43b4c7049..8ac35d52284 100644
--- a/clang/lib/ASTMatchers/ASTMatchFinder.cpp
+++ b/clang/lib/ASTMatchers/ASTMatchFinder.cpp
@@ -145,9 +145,7 @@ public:
ScopedIncrement ScopedDepth(&CurrentDepth);
Stmt *StmtToTraverse = StmtNode;
- if (auto *ExprNode = dyn_cast_or_null<LambdaExpr>(StmtNode))
- StmtToTraverse = ExprNode;
- else if (auto *ExprNode = dyn_cast_or_null<Expr>(StmtNode))
+ if (auto *ExprNode = dyn_cast_or_null<Expr>(StmtNode))
StmtToTraverse = Finder->getASTContext().traverseIgnored(ExprNode);
if (Traversal ==
ast_type_traits::TraversalKind::TK_IgnoreImplicitCastsAndParentheses) {
@@ -205,38 +203,6 @@ 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; }
diff --git a/clang/unittests/AST/ASTTraverserTest.cpp b/clang/unittests/AST/ASTTraverserTest.cpp
index 4b982431297..c995f55d3c8 100644
--- a/clang/unittests/AST/ASTTraverserTest.cpp
+++ b/clang/unittests/AST/ASTTraverserTest.cpp
@@ -479,123 +479,4 @@ FunctionDecl 'func12'
)cpp");
}
-TEST(Traverse, LambdaUnlessSpelledInSource) {
-
- auto AST =
- buildASTFromCodeWithArgs(R"cpp(
-
-void captures() {
- int a = 0;
- int b = 0;
- int d = 0;
- int f = 0;
-
- [a, &b, c = d, &e = f](int g, int h = 42) {};
-}
-
-void templated() {
- int a = 0;
- [a]<typename T>(T t) {};
-}
-
-struct SomeStruct {
- int a = 0;
- void capture_this() {
- [this]() {};
- }
- void capture_this_copy() {
- [self = *this]() {};
- }
-};
-)cpp",
- {"-Wno-unused-value", "-Wno-c++2a-extensions"});
-
- auto getLambdaNode = [&AST](const std::string &name) {
- auto BN = ast_matchers::match(
- lambdaExpr(hasAncestor(functionDecl(hasName(name)))).bind("lambda"),
- AST->getASTContext());
- EXPECT_EQ(BN.size(), 1u);
- return BN[0].getNodeAs<LambdaExpr>("lambda");
- };
-
- {
- auto L = getLambdaNode("captures");
-
- EXPECT_EQ(dumpASTString(ast_type_traits::TK_IgnoreUnlessSpelledInSource, L),
- R"cpp(
-LambdaExpr
-|-DeclRefExpr 'a'
-|-DeclRefExpr 'b'
-|-VarDecl 'c'
-| `-DeclRefExpr 'd'
-|-VarDecl 'e'
-| `-DeclRefExpr 'f'
-|-ParmVarDecl 'g'
-|-ParmVarDecl 'h'
-| `-IntegerLiteral
-`-CompoundStmt
-)cpp");
-
- EXPECT_EQ(dumpASTString(ast_type_traits::TK_AsIs, L),
- R"cpp(
-LambdaExpr
-|-CXXRecordDecl ''
-| |-CXXMethodDecl 'operator()'
-| | |-ParmVarDecl 'g'
-| | |-ParmVarDecl 'h'
-| | | `-IntegerLiteral
-| | `-CompoundStmt
-| |-FieldDecl ''
-| |-FieldDecl ''
-| |-FieldDecl ''
-| |-FieldDecl ''
-| `-CXXDestructorDecl '~'
-|-ImplicitCastExpr
-| `-DeclRefExpr 'a'
-|-DeclRefExpr 'b'
-|-ImplicitCastExpr
-| `-DeclRefExpr 'd'
-|-DeclRefExpr 'f'
-`-CompoundStmt
-)cpp");
- }
-
- {
- auto L = getLambdaNode("templated");
-
- EXPECT_EQ(dumpASTString(ast_type_traits::TK_IgnoreUnlessSpelledInSource, L),
- R"cpp(
-LambdaExpr
-|-DeclRefExpr 'a'
-|-TemplateTypeParmDecl 'T'
-|-ParmVarDecl 't'
-`-CompoundStmt
-)cpp");
- }
-
- {
- auto L = getLambdaNode("capture_this");
-
- EXPECT_EQ(dumpASTString(ast_type_traits::TK_IgnoreUnlessSpelledInSource, L),
- R"cpp(
-LambdaExpr
-|-CXXThisExpr
-`-CompoundStmt
-)cpp");
- }
-
- {
- auto L = getLambdaNode("capture_this_copy");
-
- EXPECT_EQ(dumpASTString(ast_type_traits::TK_IgnoreUnlessSpelledInSource, L),
- R"cpp(
-LambdaExpr
-|-VarDecl 'self'
-| `-UnaryOperator
-| `-CXXThisExpr
-`-CompoundStmt
-)cpp");
- }
-}
-
} // namespace clang
diff --git a/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
index b9075927d74..a21ed04b32d 100644
--- a/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
+++ b/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
@@ -1751,17 +1751,6 @@ B func12() {
return c;
}
-void func13() {
- int a = 0;
- int c = 0;
-
- [a, b = c](int d) { int e = d; };
-}
-
-void func14() {
- [] <typename TemplateType> (TemplateType t, TemplateType u) { int e = t + u; };
-}
-
)cpp";
EXPECT_TRUE(matches(
@@ -1832,23 +1821,6 @@ void func14() {
returnStmt(forFunction(functionDecl(hasName("func12"))),
hasReturnValue(
declRefExpr(to(varDecl(hasName("c")))))))));
-
- EXPECT_TRUE(matches(
- Code,
- traverse(
- ast_type_traits::TK_IgnoreUnlessSpelledInSource,
- lambdaExpr(forFunction(functionDecl(hasName("func13"))),
- has(compoundStmt(hasDescendant(varDecl(hasName("e"))))),
- has(declRefExpr(to(varDecl(hasName("a"))))),
- has(varDecl(hasName("b"), hasInitializer(declRefExpr(to(
- varDecl(hasName("c"))))))),
- has(parmVarDecl(hasName("d")))))));
-
- EXPECT_TRUE(matches(
- Code, traverse(ast_type_traits::TK_IgnoreUnlessSpelledInSource,
- lambdaExpr(
- forFunction(functionDecl(hasName("func14"))),
- has(templateTypeParmDecl(hasName("TemplateType")))))));
}
TEST(IgnoringImpCasts, MatchesImpCasts) {
OpenPOWER on IntegriCloud