[PATCH] D56444: [AST] RecursiveASTVisitor visits lambda classes when implicit visitation is on.
Stephen Kelly via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 9 07:41:12 PST 2019
steveire added a comment.
In D56444#1351182 <https://reviews.llvm.org/D56444#1351182>, @steveire wrote:
> In D56444#1351150 <https://reviews.llvm.org/D56444#1351150>, @sammccall wrote:
>
> > In D56444#1351130 <https://reviews.llvm.org/D56444#1351130>, @steveire wrote:
> >
> > > In D56444#1351125 <https://reviews.llvm.org/D56444#1351125>, @aaron.ballman wrote:
> > >
> > > > if the location isn't somewhere in user code, then don't consider the node or its children for traversal. However, that may be insufficient and equally as mysterious behavior.
> > >
> > >
> > > That is exactly what I've implemented. I skip invisible nodes in matching and dumping: http://ec2-18-191-7-3.us-east-2.compute.amazonaws.com:10240/z/EuYjAn
> >
> >
> > So what happens when someone asks about the parent of an invisible node?
> >
> > e.g. `match(hasParent(decl().bind("parent")), X, Ctx)` where X is the `operator()` function of a lambda class. (This is basically the case in the bug that this patch fixes)
>
>
> Assuming that whether to skip invisible nodes is part of the `Ctx`, the `X` would simply not be in context, just like if the `X` were not in the `TraversalScope` of the `Ctx`.
Note that as I have prototyped it, the system is perhaps too-eager, not representing the FunctionDecl (or the ParmVarDecls) at all: http://ec2-18-191-7-3.us-east-2.compute.amazonaws.com:10240/z/tTEjs3
I know what the fix is, and the result will probably be something like
TranslationUnitDecl 0x5604ea6343e8 <<invalid sloc>> <invalid sloc>
`-FunctionDecl 0x5604ea670470 <<source>:1:1, line:4:1> line:1:5 main 'int (void)'
`-CompoundStmt 0x5604ea69b0e0 <col:12, line:4:1>
|-DeclStmt 0x5604ea671260 <line:2:3, col:30>
| `-VarDecl 0x5604ea6705b0 <col:3, col:29> col:8 used l 'class (lambda at <source>:2:12)':'class (lambda at <source>:2:12)' cinit
| `-LambdaExpr 0x5604ea670c60 <col:12, col:29> 'class (lambda at <source>:2:12)'
| |-ParmVarDecl 0x558298e6c4b8 <col:15, col:19> col:19 used param 'int'
| `-CompoundStmt 0x5604ea670990 <col:16, col:29>
| `-ReturnStmt 0x5604ea670978 <col:18, col:25>
| `-IntegerLiteral 0x5604ea670838 <col:25> 'int' 12
`-DeclStmt 0x5604ea69b0c8 <line:3:3, col:18>
`-VarDecl 0x5604ea671310 <col:3, col:17> col:9 fp 'int (*)(void)' cinit
`-DeclRefExpr 0x5604ea69af00 <col:17> 'class (lambda at <source>:2:12)':'class (lambda at <source>:2:12)' lvalue Var 0x5604ea6705b0 'l' 'class (lambda at <source>:2:12)':'class (lambda at <source>:2:12)'
and ``parmVarDecl(hasName('param'), hasParent(lambdaExpr()))` would be true, as you would expect from reading the AST.
This is of course subject to change and subject to review.
Repository:
rC Clang
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D56444/new/
https://reviews.llvm.org/D56444
More information about the cfe-commits
mailing list