aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic-value1.C24
4 files changed, 43 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 89ea02d..4b42e41 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2012-04-03 Jason Merrill <jason@redhat.com>
+
+ PR c++/52796
+ * pt.c (tsubst_initializer_list): A pack expansion with no elements
+ means value-initialization.
+
2012-04-01 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/50043
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 04ba37d..ee38254 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 ca5c35a..ed9a3c5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-04-03 Jason Merrill <jason@redhat.com>
+
+ PR c++/52796
+ * g++.dg/cpp0x/variadic-value1.C: New.
+
2012-04-03 Eric Botcazou <ebotcazou@adacore.com>
* 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 0000000..179919a
--- /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<class... Ts>
+ 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();
+}