diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/AST/RecursiveASTVisitor.h | 2 | ||||
-rw-r--r-- | clang/tools/libclang/RecursiveASTVisitor.h | 2 | ||||
-rw-r--r-- | clang/unittests/Tooling/RecursiveASTVisitorTest.cpp | 21 |
3 files changed, 23 insertions, 2 deletions
diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index df71bffe850..09ac4766968 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -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) { diff --git a/clang/tools/libclang/RecursiveASTVisitor.h b/clang/tools/libclang/RecursiveASTVisitor.h index 17d70d6212e..288d0ab6626 100644 --- a/clang/tools/libclang/RecursiveASTVisitor.h +++ b/clang/tools/libclang/RecursiveASTVisitor.h @@ -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) { diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTest.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTest.cpp index 81be19003b2..2d226fddfc4 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTest.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTest.cpp @@ -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 |