re PR c++/54984 (Array allocated with new in a template class is default initialised)
authorPaolo Carlini <paolo.carlini@oracle.com>
Fri, 26 Oct 2012 14:03:32 +0000 (14:03 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 26 Oct 2012 14:03:32 +0000 (14:03 +0000)
/cp
2012-10-26  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/54984
* init.c (build_new): Don't turn a null *init into a pointer to
empty vector orig_init.

/testsuite
2012-10-26  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/54984
* g++.dg/template/new11.C: New.

From-SVN: r192846

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/new11.C [new file with mode: 0644]

index 3cd3b27bc17b9176009f8697113daffc4033ceb4..1a94fb366bd282ec69084e0aaa0587f285a55986 100644 (file)
@@ -1,3 +1,9 @@
+2012-10-26  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/54984
+       * init.c (build_new): Don't turn a null *init into a pointer to
+       empty vector orig_init.
+
 2012-10-25  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/53761
index 044603887e8a59a78e56c43e5a8a2e3b89941d1a..013b01eeb871d45825023900f036bb5577ef2f0c 100644 (file)
@@ -2911,7 +2911,8 @@ build_new (VEC(tree,gc) **placement, tree type, tree nelts,
 
       orig_placement = make_tree_vector_copy (*placement);
       orig_nelts = nelts;
-      orig_init = make_tree_vector_copy (*init);
+      if (*init)
+       orig_init = make_tree_vector_copy (*init);
 
       make_args_non_dependent (*placement);
       if (nelts)
index c3badec964f86bacb73eb611c185cfa9c893c54e..75cbf7b2dc091518ea337b372ae6f69983d25c8d 100644 (file)
@@ -1,3 +1,8 @@
+2012-10-26  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/54984
+       * g++.dg/template/new11.C: New.
+
 2012-10-26  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/54824
diff --git a/gcc/testsuite/g++.dg/template/new11.C b/gcc/testsuite/g++.dg/template/new11.C
new file mode 100644 (file)
index 0000000..76f6c66
--- /dev/null
@@ -0,0 +1,28 @@
+// PR c++/54984
+// { dg-do run }
+
+int n = 1;
+
+void* operator new(__SIZE_TYPE__)
+{
+  n = -1;
+  return &n;
+}
+
+template <class T>
+struct Foo
+{
+  Foo()
+  : x(new int)
+  {
+    if (*x != -1)
+      __builtin_abort();
+  }
+
+  int* x;
+};
+
+int main()
+{
+  Foo<float> foo;
+}