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

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to