[cfe-dev] On instantiations of template declarations.

John McCall rjmccall at apple.com
Fri Jun 4 00:34:43 PDT 2010


On Jun 3, 2010, at 11:28 PM, Abramo Bagnara wrote:

> Il 01/06/2010 18:41, Abramo Bagnara ha scritto:
>> Il 01/06/2010 17:44, Douglas Gregor ha scritto:
>>> 
>>> On Jun 1, 2010, at 7:38 AM, Enea Zaffanella wrote:
>>>> Consider now the following variant, where we have a static data member:
>>>> 
>>>> template <typename T>
>>>> struct A { static int a; };
>>>> 
>>>> template <typename T>
>>>> int A<T>::a = 0;
>>>> 
>>>> A<int> si;
>>>> A<double> sd;
>>>> 
>>>> void bar() {
>>>>  sd.a = 13;
>>>> }
>>>> 
>>>> Here, we have two implicit instantiations of the template A.
>>>> Each of those declares the corresponding static data member.
>>>> For one of those (A<double>), we also have an implicit instantiation of 
>>>> the *definition* of the static data member A<double>::a.
>>>> This implicit definition is reachable starting from the implicit 
>>>> declaration using method:
>>>> 
>>>>  VarDecl* VarDecl::getOutOfLineDefinition();
>>>>  If this is a static data member, find its out-of-line definition.
>>>> 
>>>> Strangely, the very same implicit definition is also listed in the 
>>>> context of the translation unit. This can be seen when dumping the AST, 
>>>> just after the definition of function bar():
>>>> 
>>>> ===================
>>>> [...]
>>>> void bar() (CompoundStmt 0x2151fb0 <var_template.cc:10:12, line:12:1>
>>>>  (BinaryOperator 0x216be70 <line:11:3, col:10> 'int' '='
>>>>    (MemberExpr 0x216bdf0 <col:3, col:6> 'int' .a 0x216b160
>>>>      (DeclRefExpr 0x216bdb0 <col:3> 'A<double>':'struct A<double>' 
>>>> Var='sd' 0x216ae10))
>>>>    (IntegerLiteral 0x216be30 <col:10> 'int' 13)))
>>>> 
>>>> 
>>>> static int a = (IntegerLiteral 0x216a8d0 <var_template.cc:5:15> 'int' 0)
>>>> ;
>>>> ===================
>>>> 
>>>> So, finally, our question is: why such a difference?
>>>> 
>>>> That is, why does the translation unit context contains these 
>>>> (implicitly instantiated) definitions of static data members?
>>>> It was not containing the (implicitly instantiated) specialization of 
>>>> the class template ... or of its methods.
>>> 
>>> Definitely a bug. Implicit instantiations should not show up in the translation unit context.
>> 
>> The attached patch should fix this, right? Should I commit it?
> 
> Ping.

This looks fine to me.

John.





More information about the cfe-dev mailing list