From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2122) id BE2643850855; Tue, 6 Sep 2022 20:21:17 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BE2643850855 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1662495677; bh=qnZJtlgI8TVBKx06KnvagJ0eDefNXA2s47v598CjohA=; h=From:To:Subject:Date:From; b=Wf8WT7RtRY4L9b+pzAb8TS6IfPrQPXHAtTDkbVANfJA3+0eZHM/puTwBxiLVD8+UL 6dnz7lT78TqLBkzL9PghVjJPJ+mQhPOsyumubKnb8VJHJAJmk7FqT1fVYUK9Nixi0B +IeN4sQjP8w3WiPAQFLjzeRt20erC2sOefqrERJo= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jason Merrill To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-2501] c++: C++23 operator[] allows default arguments X-Act-Checkin: gcc X-Git-Author: Jason Merrill X-Git-Refname: refs/heads/master X-Git-Oldrev: 0a4a2667dc115ca73b552fcabf8570620dfbe55f X-Git-Newrev: 0a2fba3697411c07a8330abfe7460ce62bce5e7f Message-Id: <20220906202117.BE2643850855@sourceware.org> Date: Tue, 6 Sep 2022 20:21:17 +0000 (GMT) List-Id: https://gcc.gnu.org/g:0a2fba3697411c07a8330abfe7460ce62bce5e7f commit r13-2501-g0a2fba3697411c07a8330abfe7460ce62bce5e7f Author: Jason Merrill Date: Tue Sep 6 14:18:39 2022 -0400 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. Diff: --- gcc/cp/decl.cc | 11 +++++------ gcc/testsuite/g++.dg/cpp23/subscript8.C | 7 +++++++ 2 files changed, 12 insertions(+), 6 deletions(-) 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); +};