aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2018-05-29 17:44:07 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2018-05-29 17:44:07 +0000
commit009bb506b1a01ceff3ddf0f17a78c381891dfa64 (patch)
treef75ef7c06046f84642502dfd0ca4b3d3ba1ceb0a /gcc
parent5baa6f8ebde0cc93ffe0921f572431edf3f85796 (diff)
downloadgcc-009bb506b1a01ceff3ddf0f17a78c381891dfa64.zip
gcc-009bb506b1a01ceff3ddf0f17a78c381891dfa64.tar.gz
gcc-009bb506b1a01ceff3ddf0f17a78c381891dfa64.tar.bz2
re PR c++/85883 (class template argument deduction fails in new-expression)
PR c++/85883 * init.c (build_new): Handle deducing a class with new with more than one argument. * g++.dg/cpp1z/class-deduction55.C: New test. * g++.dg/cpp1z/class-deduction56.C: New test. * g++.dg/cpp1z/class-deduction57.C: New test. From-SVN: r260901
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/init.c18
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/class-deduction55.C15
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/class-deduction56.C15
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/class-deduction57.C15
6 files changed, 75 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d411be5..9ccdfbe 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2018-05-29 Marek Polacek <polacek@redhat.com>
+
+ PR c++/85883
+ * init.c (build_new): Handle deducing a class with new
+ with more than one argument.
+
2018-05-29 Jakub Jelinek <jakub@redhat.com>
PR c++/85952
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index de1bfee..b925e84 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -3586,11 +3586,27 @@ build_new (vec<tree, va_gc> **placement, tree type, tree nelts,
if (auto_node)
{
tree d_init = NULL_TREE;
- if (vec_safe_length (*init) == 1)
+ const size_t len = vec_safe_length (*init);
+ /* E.g. new auto(x) must have exactly one element, or
+ a {} initializer will have one element. */
+ if (len == 1)
{
d_init = (**init)[0];
d_init = resolve_nondeduced_context (d_init, complain);
}
+ /* For the rest, e.g. new A(1, 2, 3), create a list. */
+ else if (len > 1)
+ {
+ unsigned int n;
+ tree t;
+ tree *pp = &d_init;
+ FOR_EACH_VEC_ELT (**init, n, t)
+ {
+ t = resolve_nondeduced_context (t, complain);
+ *pp = build_tree_list (NULL_TREE, t);
+ pp = &TREE_CHAIN (*pp);
+ }
+ }
type = do_auto_deduction (type, d_init, auto_node, complain);
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d71991f..83f16ee 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2018-05-29 Marek Polacek <polacek@redhat.com>
+
+ PR c++/85883
+ * g++.dg/cpp1z/class-deduction55.C: New test.
+ * g++.dg/cpp1z/class-deduction56.C: New test.
+ * g++.dg/cpp1z/class-deduction57.C: New test.
+
2018-05-29 Jakub Jelinek <jakub@redhat.com>
PR c++/85952
diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction55.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction55.C
new file mode 100644
index 0000000..a93d720
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction55.C
@@ -0,0 +1,15 @@
+// PR c++/85883
+// { dg-options -std=c++17 }
+
+template <typename T>
+struct Bar
+{
+ Bar(T) { }
+};
+
+int
+main ()
+{
+ auto x = Bar(1);
+ auto y = new Bar(3);
+}
diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction56.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction56.C
new file mode 100644
index 0000000..71dbfa1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction56.C
@@ -0,0 +1,15 @@
+// PR c++/85883
+// { dg-options -std=c++17 }
+
+template <typename T1, typename T2>
+struct Bar
+{
+ Bar(T1, T2) { }
+};
+
+int
+main ()
+{
+ auto x = Bar(1, 2);
+ auto y = new Bar(3, 4);
+}
diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction57.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction57.C
new file mode 100644
index 0000000..200ba6c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction57.C
@@ -0,0 +1,15 @@
+// PR c++/85883
+// { dg-options -std=c++17 }
+
+template <typename T1, typename T2, typename T3>
+struct Bar
+{
+ Bar(T1, T2, T3) { }
+};
+
+int
+main ()
+{
+ auto x = Bar(1, 2, 3);
+ auto y = new Bar(3, 4, 5);
+}