[cfe-dev] Explicit instantiation with body?

John McCall rjmccall at apple.com
Wed Jun 19 14:17:55 PDT 2013


On Jun 19, 2013, at 2:12 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> On Wed, Jun 19, 2013 at 11:42 AM, John McCall <rjmccall at apple.com> wrote:
>> On Jun 19, 2013, at 10:59 AM, Larisse Voufo <lvoufo at google.com> wrote:
>> 
>> On Wed, Jun 19, 2013 at 10:43 AM, John McCall <rjmccall at apple.com> wrote:
>>> 
>>> On Jun 19, 2013, at 9:15 AM, Larisse Voufo <lvoufo at google.com> wrote:
>>>> Just out of curiosity, I have noticed that Clang currently allows the
>>>> following program:
>>>> 
>>>> template<typename T> T f() { return 13; }
>>>> template int f() { return 1; }
>>>> 
>>>> It essentially parses the body of the explicit instantiation only to
>>>> ignore it.
>>>> Was this a conscious decision?
>> 
>> 
>> I just spoke to Richard Smith about this, and it appears that the current
>> behavior is a bit different from the way I just described it above.
>> The declaration for the template instantiation is parsed, but the 'template'
>> keyword is ignored, which leads to two different behaviors for the calls f()
>> and f<int>().
>> While f() returns 1, f<int>() returns 13. f() picks up the declaration "int
>> f() { return 1; }" while f<int>() picks up the template declaration and
>> implicitly instantiates it.
>> 
>>> 
>>> 
>>> No;  please file a bug.  You cannot define a function in an explicit
>>> instantiation.
>> 
>> 
>> I can quickly fix this or submit a patch. Should I still file a bug?
>> 
>> 
>> Fixing it is better. :)
>> 
>>>> GCC 4.6.3 rejects the program with "expected ‘;’ before ‘{’ token".
>>> 
>>> Well, hopefully we can do better than that.
>> 
>> 
>> What do you have in mind?
>> 
>> 
>> "error: cannot implement a function in an explicit instantiation"
>> 
>> or something along those lines.
> 
> My suggestion was:
> * If the declarator-id is not a template-id, issue a "function cannot
> be defined in an explicit instantiation" diagnostic and recover by
> ignoring the 'template' keyword
> * If the declarator-id is a template-id, issue an "explicit
> specialization requires 'template<>'" diagnostic with a fixit to add
> the <>, and recover as if it were an explicit specialization

Ah, yes, I wasn't thinking about the different recovery paths.
Good point.

John.



More information about the cfe-dev mailing list