diff options
author | Douglas Gregor <doug.gregor@gmail.com> | 2007-08-31 19:18:20 +0000 |
---|---|---|
committer | Doug Gregor <dgregor@gcc.gnu.org> | 2007-08-31 19:18:20 +0000 |
commit | 268127ceca311ea64ed5b67d544eea8b670f4507 (patch) | |
tree | 2f99d34ff51b2a0d4c2f5bf980a91ec2f1f8397d /gcc/cp/pt.c | |
parent | 1ab28be5966d14e3981692007b1c8aecfc7577d1 (diff) | |
download | gcc-268127ceca311ea64ed5b67d544eea8b670f4507.zip gcc-268127ceca311ea64ed5b67d544eea8b670f4507.tar.gz gcc-268127ceca311ea64ed5b67d544eea8b670f4507.tar.bz2 |
re PR c++/32597 (New operation with empty parameter pack does not value-initialize)
2007-08-31 Douglas Gregor <doug.gregor@gmail.com>
PR c++/32597
* init.c (build_default_init): Make extern.
* cp-tree.h (build_default_init): Declare here.
* pt.c (tsubst_expr): When the instantiation of the initializer of
a variable results in an empty list, default-initialize the
variable.
(tsubst_copy_and_build): When the instantiation of the initializer
in a new expression results in an empty initializer list,
default-initialize it.
2007-08-31 Douglas Gregor <doug.gregor@gmail.com>
PR c++/32597
* gcc/testsuite/g++.dg/cpp0x/variadic-new2.C: New.
* gcc/testsuite/g++.dg/cpp0x/variadic-new.C: New.
From-SVN: r128000
Diffstat (limited to 'gcc/cp/pt.c')
-rw-r--r-- | gcc/cp/pt.c | 43 |
1 files changed, 36 insertions, 7 deletions
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e1eda24..68716f1 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -9885,7 +9885,23 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, init = cp_fname_init (name, &TREE_TYPE (decl)); } else - init = RECUR (init); + { + tree t = RECUR (init); + + if (init && !t) + /* 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 = build_default_init (TREE_TYPE (decl), + NULL_TREE); + else + init = t; + } + finish_decl (decl, init, NULL_TREE); } } @@ -10489,12 +10505,25 @@ tsubst_copy_and_build (tree t, return build_x_arrow (op1); case NEW_EXPR: - return build_new - (RECUR (TREE_OPERAND (t, 0)), - RECUR (TREE_OPERAND (t, 1)), - RECUR (TREE_OPERAND (t, 2)), - RECUR (TREE_OPERAND (t, 3)), - NEW_EXPR_USE_GLOBAL (t)); + { + tree init = RECUR (TREE_OPERAND (t, 3)); + + if (TREE_OPERAND (t, 3) && !init) + /* If there was an initializer in the the original tree, but + it instantiated to an empty list, then we should pass on + VOID_ZERO_NODE to tell build_new that it was an empty + initializer () rather than no initializer. This can only + happen when the initializer is a pack expansion whose + parameter packs are of length zero. */ + init = void_zero_node; + + return build_new + (RECUR (TREE_OPERAND (t, 0)), + RECUR (TREE_OPERAND (t, 1)), + RECUR (TREE_OPERAND (t, 2)), + init, + NEW_EXPR_USE_GLOBAL (t)); + } case DELETE_EXPR: return delete_sanity |