diff --git a/include/clang/AST/RecursiveASTVisitor.h b/include/clang/AST/RecursiveASTVisitor.h index 71d7d19fed6bb2ba8d2cd822edece4782357ced2..8c49785cd0fac7f402ec79f2367e1a084848ae79 100644 --- a/include/clang/AST/RecursiveASTVisitor.h +++ b/include/clang/AST/RecursiveASTVisitor.h @@ -2266,6 +2266,9 @@ DEF_TRAVERSE_STMT(LambdaExpr, { C != CEnd; ++C) { TRY_TO(TraverseLambdaCapture(S, C)); } + for (Expr *Init : S->capture_inits()) { + TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(Init); + } TypeLoc TL = S->getCallOperator()->getTypeSourceInfo()->getTypeLoc(); FunctionProtoTypeLoc Proto = TL.castAs<FunctionProtoTypeLoc>(); diff --git a/unittests/Tooling/RecursiveASTVisitorTestExprVisitor.cpp b/unittests/Tooling/RecursiveASTVisitorTestExprVisitor.cpp index 7b62fc1571abb742ccc6f655162b29707d60674c..d39ca4b39a7f302bec823da89d11e5f892457cf2 100644 --- a/unittests/Tooling/RecursiveASTVisitorTestExprVisitor.cpp +++ b/unittests/Tooling/RecursiveASTVisitorTestExprVisitor.cpp @@ -191,6 +191,14 @@ TEST(RecursiveASTVisitor, VisitsCallExpr) { "void x(); void y() { x(); }")); } +TEST(RecursiveASTVisitor, VisitsLambdaCaptureInit) { + DeclRefExprVisitor Visitor; + Visitor.ExpectMatch("i", 1, 20); + EXPECT_TRUE(Visitor.runOver( + "void f() { int i; [i]{}; };", + DeclRefExprVisitor::Lang_CXX11)); +} + /* FIXME: According to Richard Smith this is a bug in the AST. TEST(RecursiveASTVisitor, VisitsBaseClassTemplateArgumentsInInstantiation) { DeclRefExprVisitor Visitor;