On 12/2/21 10:27, Marek Polacek wrote:
On Wed, Dec 01, 2021 at 11:24:58PM -0500, Jason Merrill wrote:
On 12/1/21 10:16, Marek Polacek wrote:
In C++23, auto(x) is valid, so decltype(auto(x)) should also be valid,
so
void f(decltype(auto(0)));
should be just as
void f(int);
but currently, everytime we see 'auto' in a parameter-declaration-clause,
we try to synthesize_implicit_template_parm for it, creating a new template
parameter list. The code above actually has us calling s_i_t_p twice;
once from cp_parser_decltype_expr -> cp_parser_postfix_expression which
fails and then again from cp_parser_decltype_expr -> cp_parser_expression.
So it looks like we have f<auto, auto> and we accept ill-formed code.
So we need to be more careful about synthesizing the implicit template
parameter. cp_parser_postfix_expression looked like a sensible place.
Does this cover other uses of auto in decltype, such as
void f(decltype(new auto{0}));
Yes: the clearing of auto_is_implicit_function_template_parm_p will happen here
too.
However, I'm noticing this:
void f1(decltype(new auto{0}));
void f2(decltype(new int{0}));
void
g ()
{
int i;
void f3(decltype(new auto{0}));
void f4(decltype(new int{0}));
f1 (&i); // error: no matching function for call to f1(int*)
// couldn't deduce template parameter auto:1
f2 (&i);
f3 (&i);
f4 (&i);
}
I think the error we issue is bogus. (My patch doesn't change this. clang++
accepts.) Should I file a PR (and investigate)?
That certainly suggests that auto_is_implicit_function_template_parm_p
isn't getting cleared soon enough for f1.
? Should we adjust this flag in cp_parser_decltype along with all the other
flags?
I think that's possible, but wouldn't cover auto in default arguments, or array
bounds.
I guess cp_parser_sizeof_operand would need the same change.
Do we currently handle auto in default arguments wrong? Ah, I see that
we currently set auto_is_... for the whole parameter declaration clause,
rather than just for the decl-specifier-seq of parameters as the
standard specifies:
"A placeholder-type-specifier of the form type-constraint opt auto can
be used as a decl-specifier of the decl-specifier-seq of a
parameter-declaration of a function declaration or lambda-expression...."
Jason