From 0592708f6bf7ae736b7f2b11ef94f3596ccd30b9 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 3 Apr 2012 23:37:11 +0000 Subject: [PATCH] PR c++/52796 * pt.c (tsubst_initializer_list): A pack expansion with no elements means value-initialization. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@186121 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 8 ++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/variadic-value1.C | 24 ++++++++++++++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic-value1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b8451f12857..0de8e3a56f9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2012-04-03 Jason Merrill + + PR c++/52796 + * pt.c (tsubst_initializer_list): A pack expansion with no elements + means value-initialization. + 2012-03-29 Meador Inge PR c++/52672 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 56e4a9cfdf0..9834c64216e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -18983,6 +18983,7 @@ tsubst_initializer_list (tree t, tree argvec) } else { + tree tmp; decl = tsubst_copy (TREE_PURPOSE (t), argvec, tf_warning_or_error, NULL_TREE); @@ -18991,10 +18992,17 @@ tsubst_initializer_list (tree t, tree argvec) in_base_initializer = 1; init = TREE_VALUE (t); + tmp = init; if (init != void_type_node) init = tsubst_expr (init, argvec, tf_warning_or_error, NULL_TREE, /*integral_constant_expression_p=*/false); + if (init == NULL_TREE && tmp != NULL_TREE) + /* If we had an initializer but it instantiated to nothing, + value-initialize the object. This will only occur when + the initializer was a pack expansion where the parameter + packs used in that expansion were of length zero. */ + init = void_type_node; in_base_initializer = 0; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d594c862656..58c01575b96 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-04-03 Jason Merrill + + PR c++/52796 + * g++.dg/cpp0x/variadic-value1.C: New. + 2012-04-03 Richard Guenther Backport from mainline diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-value1.C b/gcc/testsuite/g++.dg/cpp0x/variadic-value1.C new file mode 100644 index 00000000000..179919a5bc7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-value1.C @@ -0,0 +1,24 @@ +// PR c++/52796 +// { dg-do run { target c++11 } } + +inline void *operator new(__SIZE_TYPE__ s, void *p) { return p; } + +struct A +{ + int i; + template + A(Ts&&... ts): i(ts...) { } +}; + +static union { + unsigned char c[sizeof(A)]; + int i; +}; + +int main() +{ + i = 0xdeadbeef; + new(c) A; + if (i != 0) + __builtin_abort(); +} -- 2.11.0