r277342 - Make RecursiveASTVisitor visit lambda capture initialization expressions
Martin Bohme via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 1 05:15:47 PDT 2016
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;
More information about the cfe-commits
mailing list