[PATCH] Fix parsing comma in default arguments.

Eli Friedman eli.friedman at gmail.com
Thu Jun 13 16:30:22 PDT 2013


On Thu, Jun 13, 2013 at 4:17 PM, Olivier Goffart <ogoffart at kde.org> wrote:

> On Thursday 13 June 2013 13:52:47 Richard Smith wrote:
> > That's not really acceptable, if it can lead to rejecting valid code
> > that we accept now (such as your next example).
>
> Ok, the new attached patch fixes that issue.
>
> I'm now quite happy which what (i think) we cover.
> It even report good errors when one miss a default argument (on the right
> line)
>
> What is still not working is this:
>
> template <int, int =0> struct p { const static int w = 0; };
> struct T {
>      int i = p<0,  p<a<b>::w  >::w, p<0>::*j;
>      static const int a = 1, b = 2;
> };
>
> because a and b are declare after, and the TryAnnotateCXXScopeToken will
> display error as a and b are not defined yet.
>
> But clang did not accept this code before.  And gcc also seems to have a
> bug
> there.
>
>
> > > Also a template argument can contains = for example in this case:
> > >  struct S {constexpr S(){}; constexpr int operator=(int) const {return
> > >  5;}};
> > >  template <int> struct A {};
> > >  constexpr S s;
> > >  A<s=4> a;
> >
> > This is ill-formed.
>
> Why?
> the operator= is a constexpr


It isn't a question of what operator= resolves to; the issue is that the
grammar doesn't allow an '=' in that spot.  See [gram.expr].

-Eli
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130613/fc0d16df/attachment.html>


More information about the cfe-commits mailing list