From: Jason Merrill Date: Tue, 3 Apr 2012 23:38:21 +0000 (-0400) Subject: re PR c++/52796 ([C++11] Initialization of primitive object with 0-length parameter... X-Git-Tag: misc/gccgo-go1_1_2~3660 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a92873f12789bafcd199b7a6cf7bf17dc36fcab8;p=thirdparty%2Fgcc.git re PR c++/52796 ([C++11] Initialization of primitive object with 0-length parameter pack fails to value-initialize) PR c++/52796 * pt.c (tsubst_initializer_list): A pack expansion with no elements means value-initialization. From-SVN: r186122 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 89ea02d1935d..4b42e41de0e8 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-04-01 Paolo Carlini PR c++/50043 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 04ba37d25e7e..ee38254bd8ce 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -18925,6 +18925,7 @@ tsubst_initializer_list (tree t, tree argvec) } else { + tree tmp; decl = tsubst_copy (TREE_PURPOSE (t), argvec, tf_warning_or_error, NULL_TREE); @@ -18933,10 +18934,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 ca5c35adce8d..ed9a3c53f095 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 Eric Botcazou * gnat.dg/pack18.adb: New test. 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 000000000000..179919a5bc76 --- /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(); +}