https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87901

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Martin Sebor from comment #1)
> The example is undefined -- it forms a past the-end pointer -- and
> -Warray-bounds detects it:
> 
> warning: array subscript 2 is outside array bounds of ‘int[1]’
> [-Warray-bounds]
>     6 |   *((short *)&i + sizeof (int) - sizeof (short)) = 1;
> 
> I don't suppose you meant to do that, but presumably meant to access a part
> of the object.  But even then the code is undefined.
> 
> Can you explain/clarify what you have in mind and why it's important?

Whoops - should be + 2 - 1 (was char * before I made it to shorts).

int i;
void foo ()
{
  i = 0;
  *((short *)&i + 1) = 1;
}

the original motivation is from 36602 patch regressions.  When transforming

char z[32];

int
foo(void)
{
  memset (z, 0, 16);
  memset (z+8, 0, 24);
}

to

int
foo(void)
{
  MEM[&z] = 0;
  MEM[&z+8] = {};
}

DSE doesn't know to adjust the = 0 store (and likely not a = {} store if it
were first).

I first wanted to construct an example with unions...

Reply via email to