[cfe-dev] Template parameters for out-of-line definitions of class template methods.
Abramo Bagnara
abramo.bagnara at gmail.com
Sat Jun 12 01:16:15 PDT 2010
Il 12/06/2010 04:08, John McCall ha scritto:
>
> On Jun 3, 2010, at 11:32 PM, Abramo Bagnara wrote:
>
>> Il 03/06/2010 08:52, Enea Zaffanella ha scritto:
>>> 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?
>>
>> The attached patch shows better and implement the proposal of Enea for
>> your review/approval.
>
> If NNSInfo is going to be used in multiple places, which I think is the intent, please
> lift it out of DeclaratorDecl and give it a better name. QualifierInfo, maybe?
> OutOfLineInfo?
>
> + unsigned getNumTemplateParameterLists() const {
> + return hasExtInfo() ? DeclInfo.get<ExtInfo*>()->NumTemplParamLists : 0;
> + }
>
> Please use getExtInfo() consistently.
>
> Otherwise looks good!
Commited with suggested changes in r105882.
More information about the cfe-dev
mailing list