]> gcc.gnu.org Git - gcc.git/commit
c++: variadic using-decl with parm pack in terminal name [PR102104]
authorPatrick Palka <ppalka@redhat.com>
Thu, 15 Dec 2022 23:50:16 +0000 (18:50 -0500)
committerPatrick Palka <ppalka@redhat.com>
Thu, 15 Dec 2022 23:50:16 +0000 (18:50 -0500)
commite79d51963378b10ab90544a7d8eeb6266e9a57f6
tree268e1db420be13769feae29da9fe3a4dcbf2f7a0
parent57ab3714b6c436032ca440f9432c5837928de969
c++: variadic using-decl with parm pack in terminal name [PR102104]

There's a curious corner case with variadic member using-decls: the
terminal name can also contain a parameter pack, and only through naming
a conversion function, e.g.

  using A<Ts>::operator Ts...;

We currently only handle parameter packs appearing in the qualifying
scope of a variadic using-decl; this patch adds support for the above
case as well, representing such a using-decl via two pack expansions,
one for the qualifying scope and one for the terminal name (despite
logically there being just one).  Then at instantiation time we manually
merge them.

PR c++/102104
PR c++/108090

gcc/cp/ChangeLog:

* error.cc (dump_decl) <case USING_DECL>: Look through a
pack expansion in the name as well.
* parser.cc (cp_parser_using_declaration): Handle a parameter
pack appearing in the terminal name of a variadic using-decl.
* pt.cc (tsubst_decl) <case USING_DECL>: Likewise.  Combine the
handling of variadic and non-variadic using-decls.

gcc/testsuite/ChangeLog:

* g++.dg/cpp1z/using-variadic1.C: New test.
* g++.dg/cpp1z/using-variadic1a.C: New test.
* g++.dg/cpp1z/using-variadic1b.C: New test.
* g++.dg/cpp1z/using-variadic1c.C: New test.
* g++.dg/cpp1z/using-variadic2.C: New test.
* g++.dg/cpp1z/using-variadic3.C: New test.
gcc/cp/error.cc
gcc/cp/parser.cc
gcc/cp/pt.cc
gcc/testsuite/g++.dg/cpp1z/using-variadic1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1z/using-variadic1a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1z/using-variadic1b.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1z/using-variadic1c.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1z/using-variadic2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1z/using-variadic3.C [new file with mode: 0644]
This page took 0.073492 seconds and 6 git commands to generate.