[clang] [Clang] support friend declarations with a dependent nested-name-specifier (PR #191268)
Corentin Jabot via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 30 02:57:25 PDT 2026
================
@@ -18158,25 +18185,41 @@ DeclResult Sema::ActOnTemplatedFriendTag(
}
}
- // Handle the case of a templated-scope friend class. e.g.
- // template <class T> class A<T>::B;
- // FIXME: we don't support these right now.
- Diag(NameLoc, diag::warn_template_qualified_friend_unsupported)
- << SS.getScopeRep() << SS.getRange() << cast<CXXRecordDecl>(CurContext);
+ NestedNameSpecifier NNS = SS.getScopeRep();
+ if (EllipsisLoc.isInvalid() &&
+ CheckDependentFriend(TagLoc, NNS, TempParamLists.front()))
+ return true;
+
ElaboratedTypeKeyword ETK = TypeWithKeyword::getKeywordForTagTypeKind(Kind);
- QualType T = Context.getDependentNameType(ETK, SS.getScopeRep(), Name);
+ QualType T = Context.getDependentNameType(ETK, NNS, Name);
TypeSourceInfo *TSI = Context.CreateTypeSourceInfo(T);
+
DependentNameTypeLoc TL = TSI->getTypeLoc().castAs<DependentNameTypeLoc>();
TL.setElaboratedKeywordLoc(TagLoc);
TL.setQualifierLoc(SS.getWithLocInContext(Context));
TL.setNameLoc(NameLoc);
- FriendDecl *Friend =
- FriendDecl::Create(Context, CurContext, NameLoc, TSI, FriendLoc,
- EllipsisLoc, TempParamLists);
+ Decl *Friend;
+ if (TempParamLists.empty())
+ Friend = FriendDecl::Create(Context, CurContext, NameLoc, TSI, FriendLoc,
+ EllipsisLoc);
+ else {
+ if (CheckTemplateDeclScope(S, TempParamLists.back()))
+ return true;
+
+ Friend = FriendTemplateDecl::Create(Context, CurContext, NameLoc, TSI,
+ FriendLoc, TempParamLists, EllipsisLoc);
+ }
+
+ if (EllipsisLoc.isValid() && NNS.isDependent()) {
+ Diag(NameLoc, diag::warn_template_qualified_friend_unsupported)
+ << SS.getScopeRep() << SS.getRange() << cast<CXXRecordDecl>(CurContext);
+ cast<FriendDecl>(Friend)->setUnsupportedFriend(true);
+ }
+
----------------
cor3ntin wrote:
I think it would be better. that way we can get rid of the `unsupported` machinery - unless it would make the pr significantly more complex
https://github.com/llvm/llvm-project/pull/191268
More information about the cfe-commits
mailing list