davrec added a comment.

Once the FIXME is removed this looks good, but I was involved in this so better 
if @sammccall can give the thumbs up at least to the RecursiveASTVisitor code.


================
Comment at: clang/include/clang/AST/RecursiveASTVisitor.h:1577-1578
 DEF_TRAVERSE_DECL(FriendTemplateDecl, {
+  // FIXME: Traverse getOwnedTagDecl like at the FriendDecl case?
+  // (FriendTemplateDecl is not used)
   if (D->getFriendType())
----------------
I don't think anything is necessary here, because we should never see an 
`OwnedTagDecl` here.
In the FriendDecl case the ElaboratedType only has an OwnedTagDecl when `struct 
Fr` has not yet been declared before the friend decl.
In the documentation of FriendTemplateDecl on the other hand these examples are 
given:
```
/// template \<typename T> class A {
///   friend class MyVector<T>; // not a friend template
///   template \<typename U> friend class B; // not a friend template
///   template \<typename U> friend class Foo<T>::Nested; // friend template
/// };
```
So, a FriendTemplateDecl is only created when referencing a nested class 
template member.  But that *must* have been declared before the friend decl, or 
we will get an error:

```
template<typename T> struct B;
template<typename T> struct A { template<typename U> friend struct B<T>::Fr; }; 
//ERROR: no member named 'Fr' in B<T>
```

So the OwnedTagDecl should always be nullptr here/the issue should never arise 
in this case.



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