/* PR tree-optimization/93582 */ /* { dg-do compile } */ /* { dg-options "-O2 -Warray-bounds" } */ 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; /* { dg-bogus "array subscript 1 is outside array bounds of" } */ else return 0; } int foo (int x, int y) { struct S s; /* { dg-bogus "while referencing" } */ s.s6 = x; s.s7 = y & 0x1FFF; s.s4 = 0; return bar (&s); } static inline int qux (struct S *x) { int s4 = x->s4; if (s4) return ((struct T *)(x + 1))->t1 + ((struct T *)(x + 1))->t2; else return 0; } int baz (int x, int y) { struct S s; s.s6 = x; s.s7 = y & 0x1FFF; s.s4 = 0; return qux (&s); }