[cfe-dev] Template parameters for out-of-line definitions of class template methods.
Enea Zaffanella
zaffanella at cs.unipr.it
Wed Jun 2 23:52:48 PDT 2010
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?
Cheers,
Enea Zaffanella.
More information about the cfe-dev
mailing list