[PATCH] D131685: [clang][AST] RecursiveASTVisitor should visit owned TagDecl of friend type.
David Rector via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 16 08:38:14 PDT 2022
davrec added a comment.
In D131685#3716354 <https://reviews.llvm.org/D131685#3716354>, @balazske wrote:
> I really do not know why parent of the node for the owned `TagDecl` node is the `FriendDecl` and not a `TypeLoc` node, but it is working.
> The code `struct A { friend struct Fr; };` caused no problems either (no duplicate visit of `struct Fr`).
This is because the TraverseDecl(OwnedTagDecl) call is performed in the TraverseFriendDecl call, after the TraverseTypeLoc call has already returned -- and I assume the ParentMap just looks uses the stack of traversal calls to generate the parents.
That said, this does raise the question of whether we should instead be changing DEF_TRAVERSE_TYPE(Elaborated) to *always* traverse its owned tag decl; that way the parent would be the TypeLoc node. However in more usual cases an ET's owned tag decl is added to the parent DeclContext; e.g. for `struct B {int i} data;`, `B` and `data` are added as separate declarations in the parent context (which is annoying -- so probably the Type node really *should* always be the parent of that decl, if we were writing the AST from scratch! -- but it is what it is). So if traversed all owned tag decls, we would get some duplicate visitations.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D131685/new/
https://reviews.llvm.org/D131685
More information about the cfe-commits
mailing list