diff options
author | Jason Merrill <jason@redhat.com> | 2021-02-03 21:56:59 -0500 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2021-02-03 22:03:40 -0500 |
commit | 787f3ebf00d4e1f741ea03b6ddea9cf07a6f94ac (patch) | |
tree | 64633bcfe3be8bf6212c9982bd8d52b2659b2b47 | |
parent | 7b258ac7afaaf7d8157df10ea35c6002d935d7d0 (diff) | |
download | gcc-787f3ebf00d4e1f741ea03b6ddea9cf07a6f94ac.zip gcc-787f3ebf00d4e1f741ea03b6ddea9cf07a6f94ac.tar.gz gcc-787f3ebf00d4e1f741ea03b6ddea9cf07a6f94ac.tar.bz2 |
c++: No aggregate CTAD with explicit dguide [PR98802]
In my implementation of P2082R1 I missed this piece: the aggregate deduction
candidate is not generated if the class has user-written deduction guides.
gcc/cp/ChangeLog:
PR c++/98802
* pt.c (do_class_deduction): No aggregate guide if any_dguides_p.
gcc/testsuite/ChangeLog:
PR c++/98802
* g++.dg/cpp1z/class-deduction78.C: New test.
-rw-r--r-- | gcc/cp/pt.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/class-deduction78.C | 20 |
2 files changed, 23 insertions, 2 deletions
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index af7c67a..3605b67 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -29272,8 +29272,9 @@ do_class_deduction (tree ptype, tree tmpl, tree init, } } - if (tree guide = maybe_aggr_guide (tmpl, init, args)) - cands = lookup_add (guide, cands); + if (!any_dguides_p) + if (tree guide = maybe_aggr_guide (tmpl, init, args)) + cands = lookup_add (guide, cands); tree call = error_mark_node; diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction78.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction78.C new file mode 100644 index 0000000..6516454 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction78.C @@ -0,0 +1,20 @@ +// PR c++/98802 +// { dg-do compile { target c++17 } } + +using size_t = decltype(sizeof(42)); + +template<typename T, size_t N = 0> +struct List { + T head; + List<T, N-1> tail; +}; + +template<typename T> +struct List<T, 0> {}; + +template<typename T> List(T) -> List<T, 1>; +template<typename T, size_t N> List(T, List<T, N>) -> List<T, N+1>; + +int main() { + auto list2 = List{0, List{1, List{2}}}; +} |