]> 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 22:51:08 +0000 (18:51 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 3 Apr 2012 22:51:08 +0000 (18:51 -0400)
PR c++/52796
* pt.c (tsubst_initializer_list): A pack expansion with no elements
means value-initialization.

From-SVN: r186120

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

index a365738c35c9b905b8454ba3babac5b622b0161c..9dea1b5c1b40a770f2b7e2ebf871afec62c3e2e4 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-03-01  Release Manager
 
        * GCC 4.6.3 released.
index 0760e9e23ca9164317d0cbef4e38f0cee6027786..4defa853eaa65c2c77707080a8059c222cab9a4d 100644 (file)
@@ -17785,6 +17785,7 @@ tsubst_initializer_list (tree t, tree argvec)
             }
           else
             {
+             tree tmp;
               decl = tsubst_copy (TREE_PURPOSE (t), argvec, 
                                   tf_warning_or_error, NULL_TREE);
 
@@ -17793,10 +17794,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 9dcfc25b8891744e26d6777921d38764a6a9e413..a3a5f18e1180c65a2bec60c6ccf28678473172eb 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-03-28  Joey Ye  <joey.ye@arm.com>
 
        Backported from mainline
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();
+}