On 12/15/21 15:20, Marek Polacek wrote:
On Mon, Dec 13, 2021 at 10:02:24AM -0500, Jason Merrill wrote:
On 12/10/21 17:29, Marek Polacek wrote:
My r11-2202 was trying to enforce [dcl.type.auto.deduct]/4, which says
"If the placeholder-type-specifier is of the form type-constraint[opt]
decltype(auto), T shall be the placeholder alone."  But this made us
reject 'constexpr decltype(auto)', which, after clarification from CWG,
should be valid.  [dcl.type.auto.deduct]/4 is supposed to be a syntactic
constraint, not semantic, so it's OK that the constexpr marks the object
as const.

As a consequence, checking TYPE_QUALS in do_auto_deduction is too late,
and we have a FIXME there anyway.  So in this patch I'm attempting to
detect 'const decltype(auto)' earlier.  If I'm going to use TYPE_QUALS,
it needs to happen before we mark the object as const due to constexpr,
that is, before grokdeclarator's

    /* A `constexpr' specifier used in an object declaration declares
       the object as `const'.  */
    if (constexpr_p && innermost_code != cdk_function)
      ...

Constrained decltype(auto) was a little problem, hence the TYPENAME
check.  But in a typename context you can't use decltype(auto) anyway,
I think.

I wonder about checking even earlier, like in cp_parser_decl_specifier_seq?

That _almost_ works except it wouldn't detect things like 'decltype(auto)*'
because the '*' isn't parsed in cp_parser_decl_specifier_seq, only in
declarator.  So the

Ah, right.

      if (a != type)
        {
          error_at (loc, "%qT as type rather than plain "
            "%<decltype(auto)%>", type);

check wouldn't work.  Maybe I could just check if the next token is * or &
and give an error then.

No, checking in grokdeclarator makes sense.

Constrained decltype(auto) was a little problem, hence the TYPENAME
check.  But in a typename context you can't use decltype(auto) anyway,
I think.

Maybe check PLACEHOLDER_TYPE_CONSTRAINTS in check_decltype_auto instead?

Jason

Reply via email to