2011-05-03 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 May 2011 08:48:00 +0000 (08:48 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 May 2011 08:48:00 +0000 (08:48 +0000)
* c-decl.c (grokdeclarator): Instead of looking at
TREE_OVERFLOW check if the constant fits in the index type.

* gcc.dg/large-size-array-5.c: New testcase.

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

gcc/ChangeLog
gcc/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/large-size-array-5.c [new file with mode: 0644]

index e4b35b7..aca7c22 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-03  Richard Guenther  <rguenther@suse.de>
+
+       * c-decl.c (grokdeclarator): Instead of looking at
+       TREE_OVERFLOW check if the constant fits in the index type.
+
 2011-05-03  Richard Sandiford  <richard.sandiford@linaro.org>
 
        * config/arm/neon.md (vec_load_lanes<mode><mode>): New expanders,
index 9c6cc90..008f4c6 100644 (file)
@@ -5368,15 +5368,13 @@ grokdeclarator (const struct c_declarator *declarator,
                                             convert (index_type,
                                                      size_one_node));
 
-                   /* If that overflowed, the array is too big.  ???
-                      While a size of INT_MAX+1 technically shouldn't
-                      cause an overflow (because we subtract 1), the
-                      overflow is recorded during the conversion to
-                      index_type, before the subtraction.  Handling
-                      this case seems like an unnecessary
-                      complication.  */
-                   if (TREE_CODE (itype) == INTEGER_CST
-                       && TREE_OVERFLOW (itype))
+                   /* The above overflows when size does not fit
+                      in index_type.
+                      ???  While a size of INT_MAX+1 technically shouldn't
+                      cause an overflow (because we subtract 1), handling
+                      this case seems like an unnecessary complication.  */
+                   if (TREE_CODE (size) == INTEGER_CST
+                       && !int_fits_type_p (size, index_type))
                      {
                        if (name)
                          error_at (loc, "size of array %qE is too large",
index d9094f0..d15361c 100644 (file)
@@ -1,3 +1,7 @@
+2011-05-03  Richard Guenther  <rguenther@suse.de>
+
+       * gcc.dg/large-size-array-5.c: New testcase.
+
 2011-05-03  Richard Sandiford  <richard.sandiford@linaro.org>
 
        * gcc.dg/vect/vect-strided-u16-i3.c: New test.
diff --git a/gcc/testsuite/gcc.dg/large-size-array-5.c b/gcc/testsuite/gcc.dg/large-size-array-5.c
new file mode 100644 (file)
index 0000000..71ac473
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-Wno-overflow" } */
+
+typedef __SIZE_TYPE__ size_t;
+
+extern char a[((size_t)-1 >> 1) + 1]; /* { dg-error "too large" } */
+extern char b[((size_t)-1 >> 1)];
+extern int c[(((size_t)-1 >> 1) + 1) / sizeof(int)]; /* { dg-error "too large" } */
+extern int d[((size_t)-1 >> 1) / sizeof(int)];