<div dir="ltr">With this fix diagnostics in some cases look unclear. For instance, in these declarations:<div><br></div><div><div>template <class T> struct pr15466a;</div><div>template struct pr15466a { int a; };</div>
</div><div><br></div><div style>the second is obviously an instantiation with template arguments missing. Compiler messages however may be confusing:</div><div style><br></div><div style> t2.cpp:2:26: error: class cannot be defined in an explicit instantiation; if this declaration is meant to be a class definition,</div>
<div>      remove the 'template' keyword</div><div>template struct pr15466a { int a; };</div><div>~~~~~~~~~                ^</div><div>t2.cpp:2:17: error: redefinition of 'pr15466a' as different kind of symbol</div>
<div>template struct pr15466a { int a; };</div><div>                ^</div><div>t2.cpp:1:27: note: previous definition is here</div><div>template <class T> struct pr15466a;</div><div>                          ^</div>
<div><br></div><div style>As pr15466a in this example is already known as a template, maybe a message like "missing argumet list" is more appropriate?</div><div style><br></div><div style>Thanks,</div><div style>
--Serge</div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/6/22 Larisse Voufo <span dir="ltr"><<a href="mailto:lvoufo@google.com" target="_blank">lvoufo@google.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Problem solved. r184577. <div>I hope I got everything right. </div><div>Thanks,</div><div>-- Larisse.</div>
</div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jun 19, 2013 at 2:17 PM, John McCall <span dir="ltr"><<a href="mailto:rjmccall@apple.com" target="_blank">rjmccall@apple.com</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div>On Jun 19, 2013, at 2:12 PM, Richard Smith <<a href="mailto:richard@metafoo.co.uk" target="_blank">richard@metafoo.co.uk</a>> wrote:<br>



> On Wed, Jun 19, 2013 at 11:42 AM, John McCall <<a href="mailto:rjmccall@apple.com" target="_blank">rjmccall@apple.com</a>> wrote:<br>
>> On Jun 19, 2013, at 10:59 AM, Larisse Voufo <<a href="mailto:lvoufo@google.com" target="_blank">lvoufo@google.com</a>> wrote:<br>
>><br>
>> On Wed, Jun 19, 2013 at 10:43 AM, John McCall <<a href="mailto:rjmccall@apple.com" target="_blank">rjmccall@apple.com</a>> wrote:<br>
>>><br>
>>> On Jun 19, 2013, at 9:15 AM, Larisse Voufo <<a href="mailto:lvoufo@google.com" target="_blank">lvoufo@google.com</a>> wrote:<br>
>>>> Just out of curiosity, I have noticed that Clang currently allows the<br>
>>>> following program:<br>
>>>><br>
>>>> template<typename T> T f() { return 13; }<br>
>>>> template int f() { return 1; }<br>
>>>><br>
>>>> It essentially parses the body of the explicit instantiation only to<br>
>>>> ignore it.<br>
>>>> Was this a conscious decision?<br>
>><br>
>><br>
>> I just spoke to Richard Smith about this, and it appears that the current<br>
>> behavior is a bit different from the way I just described it above.<br>
>> The declaration for the template instantiation is parsed, but the 'template'<br>
>> keyword is ignored, which leads to two different behaviors for the calls f()<br>
>> and f<int>().<br>
>> While f() returns 1, f<int>() returns 13. f() picks up the declaration "int<br>
>> f() { return 1; }" while f<int>() picks up the template declaration and<br>
>> implicitly instantiates it.<br>
>><br>
>>><br>
>>><br>
>>> No;  please file a bug.  You cannot define a function in an explicit<br>
>>> instantiation.<br>
>><br>
>><br>
>> I can quickly fix this or submit a patch. Should I still file a bug?<br>
>><br>
>><br>
>> Fixing it is better. :)<br>
>><br>
>>>> GCC 4.6.3 rejects the program with "expected ‘;’ before ‘{’ token".<br>
>>><br>
>>> Well, hopefully we can do better than that.<br>
>><br>
>><br>
>> What do you have in mind?<br>
>><br>
>><br>
>> "error: cannot implement a function in an explicit instantiation"<br>
>><br>
>> or something along those lines.<br>
><br>
> My suggestion was:<br>
> * If the declarator-id is not a template-id, issue a "function cannot<br>
> be defined in an explicit instantiation" diagnostic and recover by<br>
> ignoring the 'template' keyword<br>
> * If the declarator-id is a template-id, issue an "explicit<br>
> specialization requires 'template<>'" diagnostic with a fixit to add<br>
> the <>, and recover as if it were an explicit specialization<br>
<br>
</div></div>Ah, yes, I wasn't thinking about the different recovery paths.<br>
Good point.<br>
<span><font color="#888888"><br>
John.</font></span></blockquote></div><br></div>
</div></div><br>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br>Thanks,<br>--Serge<br>
</div>