c++: Fix CTAD of single-element initializer list [PR99103]
authorPatrick Palka <ppalka@redhat.com>
Thu, 25 Feb 2021 21:38:08 +0000 (16:38 -0500)
committerPatrick Palka <ppalka@redhat.com>
Thu, 25 Feb 2021 21:38:08 +0000 (16:38 -0500)
commit676f6f3277181662cf3ed07769edfa2d4fb7df28
treec61df9191b1964205ac5d2a49f343c08616f50c0
parent2ffc26458dd7ba7b3fa00897f2d8c6cd24ba06f3
c++: Fix CTAD of single-element initializer list [PR99103]

When determining whether to rule out initializer-list constructors
during CTAD with a single-element initializer list (as per P0702), the
element type's cv-qualifiers should be irrelevant.  This patch fixes
this by making is_spec_or_derived strip cv-qualifiers from the supplied
expression type.

In passing, I noticed in maybe_aggr_guide we were calling
is_spec_or_derived with swapped arguments.  This led us to prefer the
aggregate deduction candidate over copying deduction in the second
testcase below with -std=c++20.

gcc/cp/ChangeLog:

PR c++/99103
* pt.c (is_spec_or_derived): Drop cv-qualifiers from 'etype'.
(maybe_aggr_guide): Fix order of arguments to is_spec_or_derived.

gcc/testsuite/ChangeLog:

PR c++/99103
* g++.dg/cpp1z/class-deduction79.C: New test.
* g++.dg/cpp1z/class-deduction80.C: New test.
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp1z/class-deduction79.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1z/class-deduction80.C [new file with mode: 0644]