/* PR tree-optimization/101397 - spurious warning writing to the result of stpcpy minus 1 { dg-do compile } { dg-options "-O2 -Wall" } */ char* stpcpy (char*, const char*); void sink (int, ...); extern char ax[], a3[3], a5[5], *s; volatile int x; void test_stpcpy (int i) { { char *p = stpcpy (ax, s); x = p[-9]; // { dg-bogus "\\\[-Warray-bounds" } x = p[-1]; // { dg-bogus "\\\[-Warray-bounds" } x = p[ 0]; x = p[+9]; } { char *p = stpcpy (a3, s); x = p[-2]; // { dg-bogus "\\\[-Warray-bounds" } x = p[-1]; // { dg-bogus "\\\[-Warray-bounds" } } { char *p = stpcpy (a3, s); x = p[-3]; // { dg-warning "\\\[-Warray-bounds" } sink (p[-2], p[-1], p[0], p[1], p[2]); x = p[ 3]; // { dg-warning "\\\[-Warray-bounds" } } { /* Stpcpy always returns a pointer to the copied nul (which must exist) and never a past-the-end pointer. As a result, P below is in [a5, a5 + 4]. */ char *p = stpcpy (a5, s); x = p[-5]; // { dg-warning "\\\[-Warray-bounds" } sink (p[-4], p[-3], p[-2], p[-1], p[0]); sink (p[1], p[2], p[3], p[4]); x = p[ 5]; // { dg-warning "\\\[-Warray-bounds" } } { char *p = stpcpy (a5 + 1, s); x = p[-5]; // { dg-warning "\\\[-Warray-bounds" } sink (p[-4], p[-3], p[-2], p[-1], p[0]); sink (p[1], p[2], p[3]); x = p[ 4]; // { dg-warning "\\\[-Warray-bounds" } } { char *p = stpcpy (a5 + 2, s); x = p[-5]; // { dg-warning "\\\[-Warray-bounds" } sink (p[-4], p[-3], p[-2], p[-1], p[0]); sink (p[1], p[2]); x = p[ 3]; // { dg-warning "\\\[-Warray-bounds" } } { char *p = stpcpy (a5 + 3, s); x = p[-5]; // { dg-warning "\\\[-Warray-bounds" } sink (p[-4], p[-3], p[-2], p[-1], p[0]); sink (p[1]); x = p[ 2]; // { dg-warning "\\\[-Warray-bounds" } } { /* Because strlen (a3) is at most 2, the stpcpy call must return a pointer in the range [ax, ax + 2], and so -3 is necessarily out of bounds. */ char *p = stpcpy (ax, a3); p[-3] = 1; // { dg-warning "\\\[-Warray-bounds" } } { if (i >= 0) i = -1; char *p = stpcpy (a3, s); x = p[i]; // { dg-bogus "\\\[-Warray-bounds" } } { if (i >= -3) i = -3; char *p = stpcpy (a3, s); p[i] = 1; // { dg-warning "\\\[-Warray-bounds" } } }