PR c++/52796
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Apr 2012 23:38:21 +0000 (23:38 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Apr 2012 23:38:21 +0000 (23:38 +0000)
* pt.c (tsubst_initializer_list): A pack expansion with no elements
means value-initialization.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@186122 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/variadic-value1.C [new file with mode: 0644]

index 89ea02d..4b42e41 100644 (file)
@@ -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
index 04ba37d..ee38254 100644 (file)
@@ -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;
             }
 
index ca5c35a..ed9a3c5 100644 (file)
@@ -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 (file)
index 0000000..179919a
--- /dev/null
@@ -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();
+}