On Fri, Aug 23, 2013 at 09:49:55PM +0000, Joseph S. Myers wrote:
> On Thu, 22 Aug 2013, Selvaraj, Senthil_Kumar wrote:
> 
> > 2013-08-23  Senthil Kumar Selvaraj  <senthil_kumar.selva...@atmel.com>
> >     * c-typeck.c (output_pending_init_elements): Handle overflow of
> >     constructor_unfilled_index.
> 
> This patch needs to add include a testcase to the testsuite that fails 
> before and passes after the patch.  (I realise such a test may only be 
> able to run for a subset of targets.)

Reattaching the patch with a testcase for the AVR target. I'm not sure
how to generalize the testcase for other targets - the constant is the
max value (unsigned) of the mode used to represent initialized array
indices.

The attached test fails with a timeout before applying the patch, and
passes after applying it.

Regards
Senthil

gcc/c/ChangeLog

2013-09-04  Senthil Kumar Selvaraj  <senthil_kumar.selva...@atmel.com>
        * c-typeck.c (output_pending_init_elements): Handle overflow of
        constructor_unfilled_index.

gcc/testsuite/ChangeLog

2013-09-04  Senthil Kumar Selvaraj  <senthil_kumar.selva...@atmel.com>
        * gcc.dg/large-size-array-7.c: New test to verify overflow handling
        of constructor_unfilled_index.

diff --git gcc/c/c-typeck.c gcc/c/c-typeck.c
index 30871db..ed2e37a 100644
--- gcc/c/c-typeck.c
+++ gcc/c/c-typeck.c
@@ -7953,8 +7953,9 @@ output_pending_init_elements (int all, struct obstack * 
braced_init_obstack)
                                 TREE_TYPE (constructor_type),
                                 constructor_unfilled_index, 0, false,
                                 braced_init_obstack);
-         else if (tree_int_cst_lt (constructor_unfilled_index,
-                                   elt->purpose))
+      else if (!TREE_OVERFLOW_P (constructor_unfilled_index)
+            && tree_int_cst_lt (constructor_unfilled_index,
+                   elt->purpose))
            {
              /* Advance to the next smaller node.  */
              if (elt->left)
@@ -7979,7 +7980,8 @@ output_pending_init_elements (int all, struct obstack * 
braced_init_obstack)
                  while (elt->parent && elt->parent->right == elt)
                    elt = elt->parent;
                  elt = elt->parent;
-                 if (elt && tree_int_cst_lt (constructor_unfilled_index,
+          if (elt && !TREE_OVERFLOW_P (constructor_unfilled_index)
+              && tree_int_cst_lt (constructor_unfilled_index,
                                              elt->purpose))
                    {
                      next = elt->purpose;
diff --git gcc/testsuite/gcc.dg/large-size-array-7.c 
gcc/testsuite/gcc.dg/large-size-array-7.c
new file mode 100644
index 0000000..196767d
--- /dev/null
+++ gcc/testsuite/gcc.dg/large-size-array-7.c
@@ -0,0 +1,5 @@
+/* { dg-do compile { target "avr-*-*" } } */
+/* { dg-options "-O2" } */
+static char * name[] = {
+    [0xFFFFFF]  = "bar"
+  }; /* { dg-error "too large" } */

Reply via email to