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

Enea Zaffanella zaffanella at cs.unipr.it
Tue Jul 31 01:51:20 PDT 2012


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.
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>




More information about the cfe-dev mailing list