diff options
author | Marek Polacek <polacek@redhat.com> | 2018-05-29 17:44:07 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2018-05-29 17:44:07 +0000 |
commit | 009bb506b1a01ceff3ddf0f17a78c381891dfa64 (patch) | |
tree | f75ef7c06046f84642502dfd0ca4b3d3ba1ceb0a /gcc | |
parent | 5baa6f8ebde0cc93ffe0921f572431edf3f85796 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/init.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/class-deduction55.C | 15 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/class-deduction56.C | 15 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/class-deduction57.C | 15 |
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); +} |