This usage was intended to be allowed by P2128, but it didn't make it into the final wording. Fixed by CWG 2507.
Tested x86_64-pc-linux-gnu, applying to trunk. 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. --- gcc/cp/decl.cc | 11 +++++------ gcc/testsuite/g++.dg/cpp23/subscript8.C | 7 +++++++ 2 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp23/subscript8.C diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc index b72b2a8456b..6d20765f40c 100644 --- a/gcc/cp/decl.cc +++ b/gcc/cp/decl.cc @@ -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") diff --git a/gcc/testsuite/g++.dg/cpp23/subscript8.C b/gcc/testsuite/g++.dg/cpp23/subscript8.C new file mode 100644 index 00000000000..fe000359d41 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp23/subscript8.C @@ -0,0 +1,7 @@ +// DR2507: Allow default arguments +// { dg-additional-options {-std=c++23} } + +struct A +{ + void operator[](int, int = 42); +}; base-commit: 0a4a2667dc115ca73b552fcabf8570620dfbe55f -- 2.31.1