================
@@ -5751,14 +5751,16 @@ void Sema::InstantiateFunctionDefinition(SourceLocation 
PointOfInstantiation,
     RebuildTypeSourceInfoForDefaultSpecialMembers();
     SetDeclDefaulted(Function, PatternDecl->getLocation());
   } else {
-    NamedDecl *ND = Function;
-    DeclContext *DC = ND->getLexicalDeclContext();
+    DeclContext *DC = Function->getLexicalDeclContext();
     std::optional<ArrayRef<TemplateArgument>> Innermost;
-    if (auto *Primary = Function->getPrimaryTemplate();
-        Primary &&
+    bool NeedDCFromPrimaryTemplate =
         !isGenericLambdaCallOperatorOrStaticInvokerSpecialization(Function) &&
         Function->getTemplateSpecializationKind() !=
-            TSK_ExplicitSpecialization) {
+            TSK_ExplicitSpecialization &&
+        !PatternDecl->getDependentSpecializationInfo();
----------------
zyn0217 wrote:

That's the first approach I've tried :)

There are some challenges stopping us from treating it as a 
TSK_ExplicitSpecialization. And it comes from the discrepancy between the 
parser and instantiator.

When parsing the friend specialization within a class context, we treat it as 
an explicit specialization, and we diagnose it very early, in 
ActOnFriendFunctionDecl.

When instantiating, we consider *all* instantiated friend declarations as 
implicit instantiations, and we hold this assumption all the way down to the 
definition instantiation.

https://github.com/llvm/llvm-project/blob/4b893398990c8966402d1469c927415f5489a9c8/clang/lib/Sema/SemaTemplate.cpp#L9356-L9358

So we ended up with an awkward situation:

1. The definition is written in explicit specialization form, but gets 
implicitly instantiated within the class.
2. The instantiator attaches the implicit instantiation to the first template 
declaration as its primary template, which doesn't have a definition, nor any 
other instantiations have the IsInstantiatedFromMemberTemplate bit (because 
they're basically instantiated from a non-template!)

Combined, we violate the assertion in instantiating the definition.

Teaching the instantiator to treat it them as explicit instantiations would 
break many existing assumptions, as in ExplicitSpecializationVisibilityChecker.

https://github.com/llvm/llvm-project/pull/139436
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to