aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2021-02-03 21:56:59 -0500
committerJason Merrill <jason@redhat.com>2021-02-03 22:03:40 -0500
commit787f3ebf00d4e1f741ea03b6ddea9cf07a6f94ac (patch)
tree64633bcfe3be8bf6212c9982bd8d52b2659b2b47
parent7b258ac7afaaf7d8157df10ea35c6002d935d7d0 (diff)
downloadgcc-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.c5
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/class-deduction78.C20
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}}};
+}