[cfe-dev] On template instantiations and specializations.

Douglas Gregor dgregor at apple.com
Mon Jun 14 13:33:54 PDT 2010


Hello Enea,

On Jun 14, 2010, at 2:33 AM, Enea Zaffanella wrote:

> Hello.
> 
> clang AST is missing nodes able to represent various kinds of 
> instantiations and/or specializations of (member of class) templates, 
> such as the following:
> 
> ============================================
> // Explicit specialization.
> template <> void foo<int>(int a) {}
> 
> // Explicit instantiation declaration.
> extern template void foo<char*>(char* s);
> 
> typedef char Char;
> // Another (redundant) explicit inst. decl.
> extern template void foo(Char* s);
> 
> // Explicit instantiation definition.
> template void foo(double);
> ============================================
> 
> Quoting from Sema::SemaTemplate.cpp:
> 
>     // FIXME: Create an ExplicitInstantiation node?
> [...]
>    // FIXME: We may still want to build some representation of this
>    // explicit specialization.
> [...]
>   // FIXME: Create some kind of ExplicitInstantiationDecl here.
> 
> We would like to hear opinions about the following proposal for filling 
> in those FIXMEs. The main goal is to provide a better distinction 
> between the syntactic and semantic issues. As hinted in the comments 
> above, we should introduce a new Decl node whose purpose is to represent 
> all syntactic aspects of the explicit specialization/instantiation of 
> (members of) templates. Let us call this new class (better names are 
> welcome)
> 
>    ExplicitSpecOrInstDecl
> 
> In our opinion, this class should be derived directly from Decl (rather 
> than inheriting from more concrete classes), provide all and only the 
> syntactic info which is peculiar of explicit template 
> specializations/instantiations (i.e., source locations of the optional 
> "extern" keyword, of the "template" keyword and of the optional "<>" 
> brackets) and then contain an appropriate Decl node for a proper 
> representation of the other stuff. That is, the new node will be somehow 
> similar to a LinkageSpecDecl node (but it will not be a DeclContext).
> 
> Note that even the declaration contained in the ExplicitSpecOrInstDecl 
> node will be mainly providing syntactic info: that is, for a construct 
> such as
> 
>   extern template void foo(Char* s);
> 
> we will have an ExplicitSpecOrInstDecl node
> (representing "extern template")
> containing a FunctionDecl node
> (representing "void foo(Char* s);"

I agree that this is a good way to model explicit instantiations and specializations.

> The actual, semantic instantiation of the function template foo for 
> template argument char* will be stored somewhere else (and will be 
> possibly be completely unaffected by this syntactic declaration).

We'll need to create a (re-)declaration of the function template specialization that contains the various parameters, template arguments, etc. as written in the explicit specialization or instantiation. 

> If the proposal above makes some sense, then we should also consider 
> whether or not it would be appropriate to extend it to the case of class 
> template specializations or instantiations (and even member classes of 
> class templates). We stress this point because currently for class 
> template a different approach is being used, whereby a class template 
> specialization is inheriting from CXXRecordDecl. This in our opinion is 
> a suboptimal design choice.

There is a difference here... FunctionDecl stores its template arguments and associated specialization information in members, while CXXRecordDecl has the ClassTemplateSpecializationDecl subclass to store this information. How is it suboptimal?

	- Doug



More information about the cfe-dev mailing list