From: Martin Bohme Date: Tue, 26 Jul 2016 15:19:10 +0000 (+0000) Subject: Make RecursiveASTVisitor visit lambda capture initialization expressions X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a00e4046e42cef7b283bf0a743a8147434ef0378;p=clang Make RecursiveASTVisitor visit lambda capture initialization expressions Summary: Lambda capture initializations are part of the explicit source code and therefore should be visited by default but, so far, RecursiveASTVisitor does not visit them. This appears to be an oversight. Because the lambda body needs custom handling (calling TraverseLambdaBody()), the DEF_TRAVERSE_STMT for LambdaExpr sets ShouldVisitChildren to false but then neglects to visit the lambda capture initializations. This patch adds code to visit the expressions associated with lambda capture initializations. Reviewers: klimek Subscribers: klimek, cfe-commits Differential Revision: https://reviews.llvm.org/D22566 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@276755 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/RecursiveASTVisitor.h b/include/clang/AST/RecursiveASTVisitor.h index 71d7d19fed..8c49785cd0 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(); diff --git a/unittests/Tooling/RecursiveASTVisitorTestExprVisitor.cpp b/unittests/Tooling/RecursiveASTVisitorTestExprVisitor.cpp index 7b62fc1571..d39ca4b39a 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;