c++: C++23 operator[] allows default arguments

This usage was intended to be allowed by P2128, but it didn't make it into
the final wording.  Fixed by CWG 2507.

	DR2507

gcc/cp/ChangeLog:

	* decl.cc (grok_op_properties): Return sooner for C++23 op[].

gcc/testsuite/ChangeLog:

	* g++.dg/cpp23/subscript8.C: New test.
This commit is contained in:
Jason Merrill 2022-09-06 14:18:39 -04:00
parent 0a4a2667dc
commit 0a2fba3697
2 changed files with 12 additions and 6 deletions

View File

@ -15331,6 +15331,11 @@ grok_op_properties (tree decl, bool complain)
"operator ()". */
return true;
/* C++23 allows an arbitrary number of parameters and default arguments for
operator[], and none of the other checks below apply. */
if (operator_code == ARRAY_REF && cxx_dialect >= cxx23)
return true;
if (operator_code == COND_EXPR)
{
/* 13.4.0.3 */
@ -15344,10 +15349,6 @@ grok_op_properties (tree decl, bool complain)
{
if (!arg)
{
/* Variadic. */
if (operator_code == ARRAY_REF && cxx_dialect >= cxx23)
break;
error_at (loc, "%qD must not have variable number of arguments",
decl);
return false;
@ -15408,8 +15409,6 @@ grok_op_properties (tree decl, bool complain)
case OVL_OP_FLAG_BINARY:
if (arity != 2)
{
if (operator_code == ARRAY_REF && cxx_dialect >= cxx23)
break;
error_at (loc,
methodp
? G_("%qD must have exactly one argument")

View File

@ -0,0 +1,7 @@
// DR2507: Allow default arguments
// { dg-additional-options {-std=c++23} }
struct A
{
void operator[](int, int = 42);
};