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 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. Marek