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

Erich Keane via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Apr 25 06:11:40 PDT 2023


erichkeane 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
----------------
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.


================
Comment at: clang/lib/Sema/SemaTemplateDeduction.cpp:3601
+    FD = const_cast<FunctionDecl *>(FDFriend);
+    Owner = FD->getDescribedFunctionTemplate()->getLexicalDeclContext();
+  }
----------------
HerrCai0907 wrote:
> erichkeane wrote:
> > I THINK this should just be:
> > `Owner = FD->getLexicalDeclContext()` here.  
> The old `Owner` is `FunctionTemplate->getLexicalDeclContext()`. So I think we should use same level owner.
Its not a question of "SameLevel", its that it was the accessible one based on what was around.  IN this case, we have a 'better' alternative, which is the FunctionDecl.  


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