forked from OSchip/llvm-project
Bug fix: Make RecursiveASTVisitor<T>::TraverseLambdaExpr call
WalkUpFromLambdaExpr, so that the Visit* functions are called on that AST node. llvm-svn: 185277
This commit is contained in:
parent
eb576c0a06
commit
9ad9959e51
|
@ -2128,6 +2128,8 @@ DEF_TRAVERSE_STMT(CXXTemporaryObjectExpr, {
|
|||
// Walk only the visible parts of lambda expressions.
|
||||
template<typename Derived>
|
||||
bool RecursiveASTVisitor<Derived>::TraverseLambdaExpr(LambdaExpr *S) {
|
||||
TRY_TO(WalkUpFromLambdaExpr(S));
|
||||
|
||||
for (LambdaExpr::capture_iterator C = S->explicit_capture_begin(),
|
||||
CEnd = S->explicit_capture_end();
|
||||
C != CEnd; ++C) {
|
||||
|
|
|
@ -2047,6 +2047,8 @@ DEF_TRAVERSE_STMT(CXXTemporaryObjectExpr, {
|
|||
// Walk only the visible parts of lambda expressions.
|
||||
template<typename Derived>
|
||||
bool RecursiveASTVisitor<Derived>::TraverseLambdaExpr(LambdaExpr *S) {
|
||||
TRY_TO(WalkUpFromLambdaExpr(S));
|
||||
|
||||
for (LambdaExpr::capture_iterator C = S->explicit_capture_begin(),
|
||||
CEnd = S->explicit_capture_end();
|
||||
C != CEnd; ++C) {
|
||||
|
|
|
@ -79,6 +79,14 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
class LambdaExprVisitor : public ExpectedLocationVisitor<LambdaExprVisitor> {
|
||||
public:
|
||||
bool VisitLambdaExpr(LambdaExpr *Lambda) {
|
||||
Match("", Lambda->getIntroducerRange().getBegin());
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class TemplateArgumentLocTraverser
|
||||
: public ExpectedLocationVisitor<TemplateArgumentLocTraverser> {
|
||||
public:
|
||||
|
@ -150,7 +158,8 @@ TEST(RecursiveASTVisitor, VisitsCXXForRangeStmtRange) {
|
|||
Visitor.ExpectMatch("x", 2, 30);
|
||||
EXPECT_TRUE(Visitor.runOver(
|
||||
"int x[5];\n"
|
||||
"void f() { for (int i : x) { x[0] = 1; } }"));
|
||||
"void f() { for (int i : x) { x[0] = 1; } }",
|
||||
DeclRefExprVisitor::Lang_CXX11));
|
||||
}
|
||||
|
||||
TEST(RecursiveASTVisitor, VisitsCXXForRangeStmtLoopVariable) {
|
||||
|
@ -158,7 +167,8 @@ TEST(RecursiveASTVisitor, VisitsCXXForRangeStmtLoopVariable) {
|
|||
Visitor.ExpectMatch("i", 2, 17);
|
||||
EXPECT_TRUE(Visitor.runOver(
|
||||
"int x[5];\n"
|
||||
"void f() { for (int i : x) {} }"));
|
||||
"void f() { for (int i : x) {} }",
|
||||
VarDeclVisitor::Lang_CXX11));
|
||||
}
|
||||
|
||||
TEST(RecursiveASTVisitor, VisitsCallExpr) {
|
||||
|
@ -461,4 +471,11 @@ TEST(RecursiveASTVisitor, VisitsCompoundLiteralType) {
|
|||
TypeLocVisitor::Lang_C));
|
||||
}
|
||||
|
||||
TEST(RecursiveASTVisitor, VisitsLambdaExpr) {
|
||||
LambdaExprVisitor Visitor;
|
||||
Visitor.ExpectMatch("", 1, 12);
|
||||
EXPECT_TRUE(Visitor.runOver("void f() { []{ return; }(); }",
|
||||
LambdaExprVisitor::Lang_CXX11));
|
||||
}
|
||||
|
||||
} // end namespace clang
|
||||
|
|
Loading…
Reference in New Issue