aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2022-03-10 15:28:20 +0100
committerJakub Jelinek <jakub@redhat.com>2022-03-10 15:28:20 +0100
commite46843ff75c37c705811e0c13bb469eda13b5f6c (patch)
treeb279306be150968e01687be58134f8c99d625e1d /gcc
parent73f3b8a53e6664c079731c2a183c16621481d039 (diff)
downloadgcc-e46843ff75c37c705811e0c13bb469eda13b5f6c.zip
gcc-e46843ff75c37c705811e0c13bb469eda13b5f6c.tar.gz
gcc-e46843ff75c37c705811e0c13bb469eda13b5f6c.tar.bz2
c++: allow variadic operator[] for C++23 [PR103460]
wg21.link/p2128 removed "with exactly one parameter" from over.sub section. grok_op_properties has for that the last 2 lines in: case OVL_OP_FLAG_BINARY: if (arity != 2) { if (operator_code == ARRAY_REF && cxx_dialect >= cxx23) break; but unfortunately it isn't enough, we reject variadic operator[] earlier. The following patch accepts variadic operator[] for C++23 too. 2022-03-10 Jakub Jelinek <jakub@redhat.com> PR c++/103460 * decl.cc (grok_op_properties): Allow variadic operator[] for C++23. * g++.dg/cpp23/subscript7.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/decl.cc6
-rw-r--r--gcc/testsuite/g++.dg/cpp23/subscript7.C17
2 files changed, 22 insertions, 1 deletions
diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index 5821090..37d52d8 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -15214,6 +15214,9 @@ 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;
@@ -15289,7 +15292,8 @@ grok_op_properties (tree decl, bool complain)
}
/* There can be no default arguments. */
- for (tree arg = argtypes; arg != void_list_node; arg = TREE_CHAIN (arg))
+ for (tree arg = argtypes; arg && arg != void_list_node;
+ arg = TREE_CHAIN (arg))
if (TREE_PURPOSE (arg))
{
TREE_PURPOSE (arg) = NULL_TREE;
diff --git a/gcc/testsuite/g++.dg/cpp23/subscript7.C b/gcc/testsuite/g++.dg/cpp23/subscript7.C
new file mode 100644
index 0000000..bb81197
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp23/subscript7.C
@@ -0,0 +1,17 @@
+// PR c++/103460
+// { dg-do compile }
+// { dg-options "-std=c++23" }
+
+struct S {
+ int &operator[] (int, ...);
+} s;
+struct T {
+ int &operator[] (auto...);
+} t;
+struct U {
+ int &operator[] (...);
+} u;
+
+int a = s[1] + s[2, 1] + s[3, 2, 1] + s[4, 3, 2, 1]
+ + t[0.0] + t[nullptr, s, 42]
+ + u[] + u[42] + u[1.5L, 1LL];