[cfe-dev] On template instantiations and specializations.
Enea Zaffanella
zaffanella at cs.unipr.it
Mon Jun 14 02:33:19 PDT 2010
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);"
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).
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.
Any comment?
Regards,
Enea.
More information about the cfe-dev
mailing list