Author: mboehme Date: Mon Aug 1 07:15:46 2016 New Revision: 277342 URL: http://llvm.org/viewvc/llvm-project?rev=277342&view=rev Log: 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: cfe-commits Differential Revision: https://reviews.llvm.org/D22566 Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h cfe/trunk/unittests/Tooling/RecursiveASTVisitorTestExprVisitor.cpp Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=277342&r1=277341&r2=277342&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original) +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Mon Aug 1 07:15:46 2016 @@ -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>(); Modified: cfe/trunk/unittests/Tooling/RecursiveASTVisitorTestExprVisitor.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Tooling/RecursiveASTVisitorTestExprVisitor.cpp?rev=277342&r1=277341&r2=277342&view=diff ============================================================================== --- cfe/trunk/unittests/Tooling/RecursiveASTVisitorTestExprVisitor.cpp (original) +++ cfe/trunk/unittests/Tooling/RecursiveASTVisitorTestExprVisitor.cpp Mon Aug 1 07:15:46 2016 @@ -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; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits