================
@@ -4159,7 +4159,7 @@ FunctionTemplateDecl *FunctionDecl::getPrimaryTemplate() 
const {
   if (FunctionTemplateSpecializationInfo *Info
         = TemplateOrSpecialization
             .dyn_cast<FunctionTemplateSpecializationInfo*>()) {
-    return Info->getTemplate();
+    return Info->getTemplate()->getMostRecentDecl();
----------------
sdkrystian wrote:

> Why do we need to get the most recent declaration in all these places?

@mizvekov One of the changes made by this patch is to set the 
`isMemberSpecialization` flag on a per-declaration basis. This ensures that 
`getTemplateInstantiationArgs` behaves correctly for implicitly instantiated 
declarations that are explicitly specialized for an implicitly instantiated 
specialization of their enclosing class template.

When we look up the name of a template, we typically find the most recent 
declaration of that template. If that declaration is an explicit specialization 
of a member template, we use the correct declaration when we try to find the 
definition of that template. However, if the member template is explicitly 
specialized _after_ we lookup its name, we end up with an expression naming the 
implicitly instantiated in-class declaration of that template. If we call 
`getTemplateInstantiationPattern` on that declaration, it will incorrectly 
return the pattern from the primary template.

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

Reply via email to