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
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@277342
91177308-0d34-0410-b5e6-
96231b3b80d8
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>();
"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;