From 643248b0b0d5b62c0a22611728365a62b117ee64 Mon Sep 17 00:00:00 2001 From: pinskia Date: Fri, 8 Sep 2006 02:49:11 +0000 Subject: [PATCH] 006-09-07 Andrew Pinski 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 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 | 9 ++++++++- gcc/cp/init.c | 8 ++++++-- gcc/testsuite/ChangeLog | 9 ++++++++- gcc/testsuite/g++.dg/other/array3.C | 14 ++++++++++++++ gcc/testsuite/g++.dg/other/array4.C | 19 +++++++++++++++++++ gcc/testsuite/g++.dg/other/array5.C | 9 +++++++++ 6 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/other/array3.C create mode 100644 gcc/testsuite/g++.dg/other/array4.C create mode 100644 gcc/testsuite/g++.dg/other/array5.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5467464..a914e2a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2006-09-07 Andrew Pinski + + 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 PR c++/27371 @@ -15,7 +22,7 @@ 2006-09-06 Zak Kipling - 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. diff --git a/gcc/cp/init.c b/gcc/cp/init.c index a88d0c0..ad40736 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -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 { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7c38ebc..2ec550f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2006-09-07 Andrew Pinski + + 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 * 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 diff --git a/gcc/testsuite/g++.dg/other/array3.C b/gcc/testsuite/g++.dg/other/array3.C new file mode 100644 index 0000000..ce3641e --- /dev/null +++ b/gcc/testsuite/g++.dg/other/array3.C @@ -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 index 0000000..97ccc98 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/array4.C @@ -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 index 0000000..df551e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/array5.C @@ -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]; -- 2.7.4