OSDN Git Service

006-09-07 Andrew Pinski <pinskia@physics.uc.edu>
authorpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Sep 2006 02:49:11 +0000 (02:49 +0000)
committerpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Sep 2006 02:49:11 +0000 (02:49 +0000)
        PR C++/28906
        * init.c (build_new_1): Build a distinct type copy
        for the array type that was returned from
        build_cplus_array_type.
2006-09-07  Andrew Pinski  <pinskia@physics.uc.edu>

        PR C++/28906
        * g++.dg/other/array3.C: New test.
        * g++.dg/other/array4.C: New test.
        * g++.dg/other/array5.C: New test.

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

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/array3.C [new file with mode: 0644]
gcc/testsuite/g++.dg/other/array4.C [new file with mode: 0644]
gcc/testsuite/g++.dg/other/array5.C [new file with mode: 0644]

index 5467464..a914e2a 100644 (file)
@@ -1,3 +1,10 @@
+2006-09-07  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR C++/28906
+       * init.c (build_new_1): Build a distinct type copy
+       for the array type that was returned from
+       build_cplus_array_type.
+
 2006-09-07  Jason Merrill  <jason@redhat.com>
 
        PR c++/27371
@@ -15,7 +22,7 @@
 
 2006-09-06  Zak Kipling  <zak@transversal.com>
 
-        PR c++/26195
+       PR c++/26195
        * decl.c (make_rtl_for_nonlocal_decl),
        (start_preparsed_function): Don't use lbasename on
        input_filename when calling get_fileinfo.
index a88d0c0..ad40736 100644 (file)
@@ -1628,10 +1628,14 @@ build_new_1 (tree placement, tree type, tree nelts, tree init,
         function context.  Methinks that's not it's purvey.  So we'll do
         our own VLA layout later.  */
       vla_p = true;
-      full_type = build_cplus_array_type (type, NULL_TREE);
       index = convert (sizetype, nelts);
       index = size_binop (MINUS_EXPR, index, size_one_node);
-      TYPE_DOMAIN (full_type) = build_index_type (index);
+      index = build_index_type (index);
+      full_type = build_cplus_array_type (type, NULL_TREE);
+      /* We need a copy of the type as build_array_type will return a shared copy
+         of the incomplete array type.  */
+      full_type = build_distinct_type_copy (full_type);
+      TYPE_DOMAIN (full_type) = index;
     }
   else
     {
index 7c38ebc..2ec550f 100644 (file)
@@ -1,3 +1,10 @@
+2006-09-07  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR C++/28906
+       * g++.dg/other/array3.C: New test.
+       * g++.dg/other/array4.C: New test.
+       * g++.dg/other/array5.C: New test.
+
 2006-09-07  H.J. Lu  <hongjiu.lu@intel.com>
 
        * gcc.target/i386/pr28946.c (dg-options): Use -Os instead -O.
@@ -11,7 +18,7 @@
 
        * gfortran.fortran-torture/compile/data_1.f90: Fix integer oveflow
        in integer literal constant.
-       * gfortran.dg/enum_8.f90: Ditto.
+       * gfortran.dg/enum_8.f90: Ditto.
        * gfortran.dg/g77/20030326-1.f: Ditto.
 
 2006-09-07  Feng Wang  <fengwang@nudt.edu.cn>
diff --git a/gcc/testsuite/g++.dg/other/array3.C b/gcc/testsuite/g++.dg/other/array3.C
new file mode 100644 (file)
index 0000000..ce3641e
--- /dev/null
@@ -0,0 +1,14 @@
+// PR C++/28906: new on an array causes incomplete arrays to
+// become complete with the wrong size.
+
+// the bounds of xvalue_store was being set to include want
+// which was incorrect.
+
+// { dg-do compile }
+
+extern unsigned char xvalue_store[];
+bool reserve (int want)
+{
+  new unsigned char[want];
+}
+unsigned char xvalue_store[257];
diff --git a/gcc/testsuite/g++.dg/other/array4.C b/gcc/testsuite/g++.dg/other/array4.C
new file mode 100644 (file)
index 0000000..97ccc98
--- /dev/null
@@ -0,0 +1,19 @@
+// PR C++/28906: new on an array causes incomplete arrays to
+// become complete with the wrong size.
+// The sizeof machineMain should be 5 and not 100.
+// { dg-do run }
+
+
+extern char machineMain[];
+void sort (long len)
+{
+  new char[100];
+}
+char machineMain[] = "main";
+int main(void)
+{
+  if (sizeof(machineMain)!=sizeof("main"))
+    __builtin_abort();
+}
+
+
diff --git a/gcc/testsuite/g++.dg/other/array5.C b/gcc/testsuite/g++.dg/other/array5.C
new file mode 100644 (file)
index 0000000..df551e3
--- /dev/null
@@ -0,0 +1,9 @@
+// Check to make sure changing from an incomplete
+// array type to a complete one does not change other
+// incomplete array type's bounds.
+// { dg-do compile }
+
+extern unsigned char xvalue_store[];
+extern unsigned char xvalue_store1[];
+unsigned char xvalue_store[7];
+unsigned char xvalue_store1[9];