[cfe-dev] Explicit instantiation with body?

Larisse Voufo lvoufo at google.com
Fri Jun 21 11:59:33 PDT 2013


Problem solved. r184577.
I hope I got everything right.
Thanks,
-- Larisse.


On Wed, Jun 19, 2013 at 2:17 PM, John McCall <rjmccall at apple.com> wrote:

> 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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130621/b8e721fa/attachment.html>


More information about the cfe-dev mailing list