On Mon, 2 May 2011, Joseph S. Myers wrote:
> On Mon, 2 May 2011, Richard Guenther wrote:
>
> > This changes the code that deals with too large array sizes to
> > use int_fits_type_p instead of relying on the TREE_OVERFLOW setting
> > of the tree folder. The latter will break once we don't treat
> > sizetypes specially (and they keep being unsigned).
> >
> > Bootstrapped and tested on x86_64-unknown-linux-gnu, ok for trunk?
>
> An array size in C or C++ ought to be considered to overflow (and so give
> an error if the size is compile-time constant) if the size of the array in
> bytes is greater than or equal to half the address space, because it is
> then no longer possible to compute differences between all array elements,
> and pointers to just past the end of the array, reliably as ptrdiff_t
> values (cf. PR 45779). Thus, overflow in a signed rather than unsigned
> type is what's relevant.
>
> I don't know if there's a relevant testcase in the testsuite, but the
> patch is OK with the addition of a testcase such as
>
> /* { dg-do compile } */
> /* { dg-options "" } */
>
> 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)];
>
> supposing it passes.
We do have similar testcases in gcc.dg/large-size-array*.c, but not
exactly testing the bound. The above testcase also complains with
-pedantic about
t.c:3:13: error: size of array āaā is too large
t.c:4:1: error: overflow in constant expression [-Woverflow]
t.c:5:12: error: size of array ācā is too large
t.c:6:1: error: overflow in constant expression [-Woverflow]
with and without the patch. I can add -Wno-overflow to the flags.
Ok with that?
Thanks,
Richard.