/* PR middle-end/100137 - -Warray-bounds false positive on varying offset plus negative { dg-do compile } { dg-options "-O2 -Wall" } */ extern char ax[], a1[1], a2[2], a3[3], a4[4], a5[5]; int* ptr; #define X (*ptr++) __attribute__ ((noipa)) void array_plus_var_minus_cstint (int i, int j) { { const char *p = ax; p += i; X = p[-1]; X = p[-123]; } { const char *p = a1; p += i; X = p[-1]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-2]; // { dg-warning "\\\[-Warray-bounds" } X = p[-3]; // { dg-warning "\\\[-Warray-bounds" } X = p[-4]; // { dg-warning "\\\[-Warray-bounds" } } { const char *p = a2; p += i; X = p[-1]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-2]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-3]; // { dg-warning "\\\[-Warray-bounds" } X = p[-4]; // { dg-warning "\\\[-Warray-bounds" } } { const char *p = a3; p += i; X = p[-1]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-2]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-3]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-4]; // { dg-warning "\\\[-Warray-bounds" } X = p[-5]; // { dg-warning "\\\[-Warray-bounds" } } { const char *p = a4; p += i; X = p[-1]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-2]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-3]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-4]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-5]; // { dg-warning "\\\[-Warray-bounds" } X = p[-6]; // { dg-warning "\\\[-Warray-bounds" } } { const char *p = a5; p += i; p += j; X = p[-1]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-2]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-3]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-4]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-5]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-6]; // { dg-warning "\\\[-Warray-bounds" } } } __attribute__ ((noipa)) void array_plus_var_minus_cstlong (long i, long j) { { const char *p = ax; p += i; X = p[-1]; X = p[-123]; } { const char *p = a1; p += i; X = p[-1]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-2]; // { dg-warning "\\\[-Warray-bounds" } X = p[-3]; // { dg-warning "\\\[-Warray-bounds" } X = p[-4]; // { dg-warning "\\\[-Warray-bounds" } } { const char *p = a2; p += i; X = p[-1]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-2]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-3]; // { dg-warning "\\\[-Warray-bounds" } X = p[-4]; // { dg-warning "\\\[-Warray-bounds" } } { const char *p = a3; p += i; X = p[-1]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-2]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-3]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-4]; // { dg-warning "\\\[-Warray-bounds" } X = p[-5]; // { dg-warning "\\\[-Warray-bounds" } } { const char *p = a4; p += i; X = p[-1]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-2]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-3]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-4]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-5]; // { dg-warning "\\\[-Warray-bounds" } X = p[-6]; // { dg-warning "\\\[-Warray-bounds" } } { const char *p = a5; p += i; p += j; X = p[-1]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-2]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-3]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-4]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-5]; // { dg-bogus "\\\[-Warray-bounds" } X = p[-6]; // { dg-warning "\\\[-Warray-bounds" } } }