On Fri, Nov 01, 2019 at 03:42:58PM -0400, Jason Merrill wrote:
> > +     for (size_t n = cp_parser_skip_balanced_tokens (parser, 1); ; n++)
> > +       {
> > +         size_t after = cp_parser_skip_attributes_opt (parser, n);
> > +         if (after > n)
> > +           {
> > +             n = after - 1;
> > +             continue;
> > +           }
> 
> You don't need to skip attributes, the decl-specifiers come immediately
> after the ).

void
foo ()
{
  auto a = [] () [[noreturn]] constexpr {};
  auto b = [] () __attribute__((noreturn)) constexpr {};
  auto c = [] () mutable constexpr {};
}

(using constexpr instead of consteval to be able to test it without my
patch) is certainly accepted, not sure if that is conforming or not.

The grammar has
decl-specifier-seq[opt] after the ) in lambda-declarator and
decl-specifier-seq:
  decl-specifier attribute-specifier-seq[opt]
  decl-specifier decl-specifier-seq
so I'd say attribute-specifier-seq is only allowed at the very end of the
decl-specifier-seq, so maybe we have an accepts-invalid bug, but the
grammar doesn't cover the GNU attributes anyway.

> 
> OK with that change.
> 
> > +         if (!cp_lexer_nth_token_is (parser->lexer, n, CPP_KEYWORD))
> > +           break;
> > +         if (cp_lexer_peek_nth_token (parser->lexer, n)->keyword
> > +             == RID_CONSTEVAL)
> 
> I suppose it's reasonable to not consider "mutable consteval" here.  :)
> 
> > +           {
> > +             is_consteval = true;
> > +             break;
> > +           }

The code should handle mutable consteval, as mutable is a keyword and it
will just keep looking after that keyword.

        Jakub

Reply via email to