On 12/15/21 16:28, Marek Polacek wrote:
On Wed, Dec 15, 2021 at 04:17:37PM -0500, Jason Merrill wrote:
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?
I've tried that, but that is also true for
const constexpr C decltype(auto) x2 = 0;
const constexpr C decltype(auto) fn4() { return 0; }
where we do want to check if the auto has quals. Therefore the not very
pretty TYPENAME check :/.
Aha. The patch is OK.
Jason