aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2007-09-26 13:32:27 +0100
committerJoseph Myers <jsm28@gcc.gnu.org>2007-09-26 13:32:27 +0100
commit7bfcb402eab7dbcf0108c5b9682a8b409fad4359 (patch)
treef9e25dc097a9407299c63b509b39e45c44233eae /gcc
parent15caa2abe98b8a46bb0225da1d81e585d904d5f2 (diff)
downloadgcc-7bfcb402eab7dbcf0108c5b9682a8b409fad4359.zip
gcc-7bfcb402eab7dbcf0108c5b9682a8b409fad4359.tar.gz
gcc-7bfcb402eab7dbcf0108c5b9682a8b409fad4359.tar.bz2
re PR c/25309 (ICE on initialization of a huge array)
PR c/25309 * c-common.c (complete_array_type): Diagnose too-large arrays and set type to error_mark_node. testsuite: * gcc.dg/large-size-array-2.c: Expect diagnostic for too-large array. * gcc.dg/large-size-array-4.c: New. Copy of large-size-array-2.c without -O2. From-SVN: r128811
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/c-common.c10
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.dg/large-size-array-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/large-size-array-4.c7
5 files changed, 32 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f5fb4a6..a126c95 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-09-26 Joseph Myers <joseph@codesourcery.com>
+
+ PR c/25309
+ * c-common.c (complete_array_type): Diagnose too-large arrays and
+ set type to error_mark_node.
+
2007-09-26 Richard Guenther <rguenther@suse.de>
PR tree-optimization/30375
diff --git a/gcc/c-common.c b/gcc/c-common.c
index 8ebc920..bdb8d80 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -7049,6 +7049,16 @@ complete_array_type (tree *ptype, tree initial_value, bool do_default)
else
type = c_build_qualified_type (main_type, quals);
+ if (COMPLETE_TYPE_P (type)
+ && TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST
+ && TREE_OVERFLOW (TYPE_SIZE_UNIT (type)))
+ {
+ error ("size of array is too large");
+ /* If we proceed with the array type as it is, we'll eventually
+ crash in tree_low_cst(). */
+ type = error_mark_node;
+ }
+
*ptype = type;
return failure;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c43dad2..d2bb725 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2007-09-26 Joseph Myers <joseph@codesourcery.com>
+
+ PR c/25309
+ * gcc.dg/large-size-array-2.c: Expect diagnostic for too-large
+ array.
+ * gcc.dg/large-size-array-4.c: New. Copy of large-size-array-2.c
+ without -O2.
+
2007-09-26 Richard Guenther <rguenther@suse.de>
PR tree-optimization/30375
diff --git a/gcc/testsuite/gcc.dg/large-size-array-2.c b/gcc/testsuite/gcc.dg/large-size-array-2.c
index 6ac31d11..5411b83 100644
--- a/gcc/testsuite/gcc.dg/large-size-array-2.c
+++ b/gcc/testsuite/gcc.dg/large-size-array-2.c
@@ -4,4 +4,4 @@
static char * name[] = {
[0x80000000] = "bar"
};
-
+/* { dg-error "too large" "" { target { ! lp64 } } 6 } */
diff --git a/gcc/testsuite/gcc.dg/large-size-array-4.c b/gcc/testsuite/gcc.dg/large-size-array-4.c
new file mode 100644
index 0000000..020d57e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/large-size-array-4.c
@@ -0,0 +1,7 @@
+/* PR c/25309 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+static char * name[] = {
+ [0x80000000] = "bar"
+ };
+/* { dg-error "too large" "" { target { ! lp64 } } 6 } */