[cfe-dev] The lexical DeclContext of class template instantiations.

Enea Zaffanella zaffanella at cs.unipr.it
Tue Sep 4 09:45:56 PDT 2012


Ping^4 ...

On 08/21/2012 11:51 AM, Enea Zaffanella wrote:
> Ping^3.
>
> I no one has objections, we would like to apply this patch
> (passes all clang tests).
>
> Enea.
>
>
> On 07/31/2012 10:51 AM, Enea Zaffanella wrote:
>> Ping^2.
>>
>> On 07/13/2012 09:17 AM, Enea Zaffanella wrote:
>>> Ping.
>>>
>>> On 07/08/2012 07:19 PM, Enea Zaffanella wrote:
>>>> Hello.
>>>>
>>>> I would like to hear some informed opinions on the following, which
>>>> seems to be an AST quality issue.
>>>>
>>>> When parsing the following file:
>>>>
>>>> $ cat lex_dc.cc
>>>> template <typename T>
>>>> struct Outer {
>>>>       template <typename U> static void InnerFun(T, U) {}
>>>>       template <typename U> struct InnerRecord { T* t; U u; };
>>>> };
>>>>
>>>> struct S {
>>>>       static void bar() { Outer<S>::InnerFun<int>(S(), 5); }
>>>>       Outer<S>::InnerRecord<int> is;
>>>> };
>>>>
>>>>
>>>> the AST generated by clang contains implicit instantiations for
>>>>        Outer<S>::InnerFun<int>
>>>> and
>>>>        Outer<S>::InnerRecord<int>.
>>>>
>>>> It happens that the function Outer<S>::InnerFun<int> has the same
>>>> semantic and lexical DeclContext, namely struct Outer<S>.
>>>>
>>>> In contrast, the record Outer<S>::InnerRecord<int> has Outer<S> as the
>>>> semantic DeclContext, but it has struct S as the lexical one.
>>>>
>>>> This looks quite odd ... for instance, one of the consequences is that,
>>>> when querying Outer<S>::InnerRecord<int> with method
>>>>        bool isOutOfLine()
>>>> we would be obtaining a positive answer.
>>>>
>>>> Afaict, the problem is caused by method
>>>>
>>>> QualType
>>>> Sema::CheckTemplateIdType(
>>>>         TemplateName Name,
>>>>         SourceLocation TemplateLoc,
>>>>         TemplateArgumentListInfo &TemplateArgs);
>>>>
>>>> around line 2077 of SemaTemplate.cpp, where it does
>>>>
>>>>       ClassTemplate->AddSpecialization(Decl, InsertPos);
>>>>       Decl->setLexicalDeclContext(CurContext);
>>>>
>>>> Am I guessing correctly if I say that it should be something like
>>>>
>>>>       ClassTemplate->AddSpecialization(Decl, InsertPos);
>>>>       if (ClassTemplate->isOutOfLine())
>>>>
>>>> Decl->setLexicalDeclContext(ClassTemplate->getLexicalDeclContext());
>>>>
>>>> ?
>>>>
>>>> Enea.
>




More information about the cfe-dev mailing list