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

Enea Zaffanella zaffanella at cs.unipr.it
Fri Jul 13 00:17:20 PDT 2012


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
>





More information about the cfe-dev mailing list