[cfe-dev] Template parameters for out-of-line definitions of class template methods.

Douglas Gregor dgregor at apple.com
Fri Jun 4 15:17:41 PDT 2010


On Jun 2, 2010, at 11:52 PM, Enea Zaffanella wrote:

> Douglas Gregor wrote:
>> On Apr 21, 2010, at 12:20 PM, Enea Zaffanella wrote:
>>> Hello.
>>> 
>>> We have a somewhat naive question regarding the AST generated for the following program fragment:
>>> ======================================
>>> template <typename T>
>>> struct S {
>>>  void foo();
>>> };
>>> 
>>> template <class W>
>>> void S<W>::foo() {}
>>> ======================================
>>> 
>>> We would like to retrieve the template parameter list for the out-of-line definition of method foo(), that is
>>>  template <class W>
>>> but we cannot see if and how this could be achieved.
>> Clang's AST doesn't actually store the template parameter list that was used in the out-of-line definition. It should.
> 
> Hello.
> 
> Reconsidering the point above, we would like to propose a solution.
> 
> The template parameter lists we are interested in are simply thrown away after calls to method
> 
>  TemplateParameterList*
>  Sema::MatchTemplateParametersToScopeSpecifier
>    (SourceLocation DeclStartLoc, const CXXScopeSpec &SS,
>     TemplateParameterList **ParamLists, unsigned NumParamLists,
>     bool IsFriend, bool &IsExplicitSpecialization);
> 
> Hence, we simply have to store somewhere the lists of parameters that have been matched against the CXXScopeSpec: either all of the lists in ParamLists, or all but the last one (which would be the one returned as result).
> 
> As far as we can see, the best place for this info is in the ExtInfo struct inside DeclaratorDecl, so that the space overhead will be paid only in the uncommon case of an out-of-line declaration:
> 
> 00369 class DeclaratorDecl : public ValueDecl {
> 00370   // A struct representing both a TInfo and a syntactic qualifier,
> 00371   // to be used for the (uncommon) case of out-of-line declarations.
> 00372   struct ExtInfo {
> 00373     TypeSourceInfo *TInfo;
> 00374     NestedNameSpecifier *NNS;
> 00375     SourceRange NNSRange;
> 00376   };
> 
> A similar chnage will be done for the ExtInfo struct inside TagDecl nodes.
> 
> Would this be OK?

Yes, this would be great!

	- Doug



More information about the cfe-dev mailing list