[Bug middle-end/93582] [10 Regression] -Warray-bounds gives error: array subscript 0 is outside array bounds of struct E[1]
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Feb 5 12:31:00 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93582
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|RESOLVED |REOPENED
Last reconfirmed| |2020-02-05
CC| |jakub at gcc dot gnu.org
Resolution|INVALID |---
Ever confirmed|0 |1
--- Comment #12 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
The reduced tests don't really show up what is happening though.
Better testcase with the false positive warning even on x86_64 at e.g. -O2:
struct S {
unsigned int s1:1;
unsigned int s2:1;
unsigned int s3:1;
unsigned int s4:1;
unsigned int s5:4;
unsigned char s6;
unsigned short s7;
unsigned short s8;
};
struct T {
int t1;
int t2;
};
static inline int
bar (struct S *x)
{
if (x->s4)
return ((struct T *)(x + 1))->t1 + ((struct T *)(x + 1))->t2;
else
return 0;
}
int
foo (int x, int y)
{
struct S s;
s.s6 = x;
s.s7 = y & 0x1FFF;
s.s4 = 0;
return bar (&s);
}
The warning is in dead code, but due to the optimize_bit_field_compare
"optimization" we aren't able to find that out until combine.
We have:
s.s4 = 0;
_4 = BIT_FIELD_REF <s, 8, 0>;
_6 = _4 & 8;
I think this is generally something that FRE/PRE is able to optimize, at least
if it is
s.s4 = 0;
_6 = s.s4;
but the BIT_FIELD_REF in there prevents that. In this case the full 8 bits are
actually undefined, there is just one defined bit in there, but it actually
isn't optimized even if I add constant initialization of the other bitfields
(s1-s5).
Could FRE/PRE handle this perhaps at the point of BIT_AND_EXPR with
BIT_FIELD_REF and constant operands, and only for the needed bits try to look
them all up?
More information about the Gcc-bugs
mailing list