[PATCH] D149009: [Sema]Select correct lexical context during template instantiate

Congcong Cai via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Apr 25 14:18:42 PDT 2023


HerrCai0907 added inline comments.


================
Comment at: clang/lib/Sema/SemaTemplateDeduction.cpp:3598
+      FD->isDefined(FDFriend, true) &&
+      FDFriend->getFriendObjectKind() != Decl::FriendObjectKind::FOK_None) {
+    // if Function defined by inline friend, use inline fried as DeclContext
----------------
erichkeane wrote:
> HerrCai0907 wrote:
> > erichkeane wrote:
> > > So in what case would the currently-instantiated definition NOT also be a friend?  I would think this last condition should be able to be an assert instead.
> > Last condition cannot be an assert, define and declare in difference place is common case, what we need to identifier in here is inlined friend define.
> Can you be more clear here?  WHEN can a definition and declaration NOT have the same friend object kind?  THAT is probably incorrect a bug.
Sorry I cannot get the point. 
Here I have 3 conditions:
1. FD->getFriendObjectKind() == Decl::FriendObjectKind::FOK_None
FD(declaration) is not friend object.
2. FD->isDefined(FDFriend, true)
get FDFriend(definition) from FD(declaration).
3. FDFriend->getFriendObjectKind() != Decl::FriendObjectKind::FOK_None)
FDFriend(definition) is friend object.

matching those 3 condition and then we can say FDFriend is a inline friend like
```
template <class F1> int foo(F1 X); // FD
template <int A1> struct A {
template <class F1> friend int foo(F1 X) { return A1; } // FDFriend
};
```


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D149009/new/

https://reviews.llvm.org/D149009



More information about the cfe-commits mailing list