]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/52796 ([C++11] Initialization of primitive object with 0-length parameter...
authorJason Merrill <jason@redhat.com>
Tue, 3 Apr 2012 23:38:21 +0000 (19:38 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 3 Apr 2012 23:38:21 +0000 (19:38 -0400)
PR c++/52796
* pt.c (tsubst_initializer_list): A pack expansion with no elements
means value-initialization.

From-SVN: r186122

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

index 89ea02d1935d5a2c0110745f6597e28bd51c33f9..4b42e41de0e825d10cb8b01202ad14b35b0c42a7 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 04ba37d25e7e03ee31c18ea5042c9d7272e9ffde..ee38254bd8ceb4c94c6063572a69fccdd39ac453 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 ca5c35adce8d968567e8f4d739020767db05fb65..ed9a3c53f09501c97a66d464173c4e02e2df5f76 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();
+}