diff options
author | Jakub Jelinek <jakub@redhat.com> | 2022-03-10 15:28:20 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2022-03-10 15:28:20 +0100 |
commit | e46843ff75c37c705811e0c13bb469eda13b5f6c (patch) | |
tree | b279306be150968e01687be58134f8c99d625e1d | |
parent | 73f3b8a53e6664c079731c2a183c16621481d039 (diff) | |
download | gcc-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.
-rw-r--r-- | gcc/cp/decl.cc | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp23/subscript7.C | 17 |
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]; |