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.
|
// Walk only the visible parts of lambda expressions.
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
bool RecursiveASTVisitor<Derived>::TraverseLambdaExpr(LambdaExpr *S) {
|
bool RecursiveASTVisitor<Derived>::TraverseLambdaExpr(LambdaExpr *S) {
|
||||||
|
TRY_TO(WalkUpFromLambdaExpr(S));
|
||||||
|
|
||||||
for (LambdaExpr::capture_iterator C = S->explicit_capture_begin(),
|
for (LambdaExpr::capture_iterator C = S->explicit_capture_begin(),
|
||||||
CEnd = S->explicit_capture_end();
|
CEnd = S->explicit_capture_end();
|
||||||
C != CEnd; ++C) {
|
C != CEnd; ++C) {
|
||||||
|
|
|
@ -2047,6 +2047,8 @@ DEF_TRAVERSE_STMT(CXXTemporaryObjectExpr, {
|
||||||
// Walk only the visible parts of lambda expressions.
|
// Walk only the visible parts of lambda expressions.
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
bool RecursiveASTVisitor<Derived>::TraverseLambdaExpr(LambdaExpr *S) {
|
bool RecursiveASTVisitor<Derived>::TraverseLambdaExpr(LambdaExpr *S) {
|
||||||
|
TRY_TO(WalkUpFromLambdaExpr(S));
|
||||||
|
|
||||||
for (LambdaExpr::capture_iterator C = S->explicit_capture_begin(),
|
for (LambdaExpr::capture_iterator C = S->explicit_capture_begin(),
|
||||||
CEnd = S->explicit_capture_end();
|
CEnd = S->explicit_capture_end();
|
||||||
C != CEnd; ++C) {
|
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
|
class TemplateArgumentLocTraverser
|
||||||
: public ExpectedLocationVisitor<TemplateArgumentLocTraverser> {
|
: public ExpectedLocationVisitor<TemplateArgumentLocTraverser> {
|
||||||
public:
|
public:
|
||||||
|
@ -150,7 +158,8 @@ TEST(RecursiveASTVisitor, VisitsCXXForRangeStmtRange) {
|
||||||
Visitor.ExpectMatch("x", 2, 30);
|
Visitor.ExpectMatch("x", 2, 30);
|
||||||
EXPECT_TRUE(Visitor.runOver(
|
EXPECT_TRUE(Visitor.runOver(
|
||||||
"int x[5];\n"
|
"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) {
|
TEST(RecursiveASTVisitor, VisitsCXXForRangeStmtLoopVariable) {
|
||||||
|
@ -158,7 +167,8 @@ TEST(RecursiveASTVisitor, VisitsCXXForRangeStmtLoopVariable) {
|
||||||
Visitor.ExpectMatch("i", 2, 17);
|
Visitor.ExpectMatch("i", 2, 17);
|
||||||
EXPECT_TRUE(Visitor.runOver(
|
EXPECT_TRUE(Visitor.runOver(
|
||||||
"int x[5];\n"
|
"int x[5];\n"
|
||||||
"void f() { for (int i : x) {} }"));
|
"void f() { for (int i : x) {} }",
|
||||||
|
VarDeclVisitor::Lang_CXX11));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(RecursiveASTVisitor, VisitsCallExpr) {
|
TEST(RecursiveASTVisitor, VisitsCallExpr) {
|
||||||
|
@ -461,4 +471,11 @@ TEST(RecursiveASTVisitor, VisitsCompoundLiteralType) {
|
||||||
TypeLocVisitor::Lang_C));
|
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
|
} // end namespace clang
|
||||||
|
|
Loading…
Reference in New Issue