| /* PR tree-optimization/101397 - spurious warning writing to the result |
| of stpcpy minus 1 |
| { dg-do compile } |
| { dg-options "-O2 -Wall" } */ |
| |
| char* strcpy (char*, const char*); |
| |
| void sink (int, ...); |
| |
| extern char ax[], a3[3], a5[5], *s; |
| |
| volatile int x; |
| |
| void test_strcpy (int i) |
| { |
| { |
| char *p = strcpy (ax, s); |
| x = p[-1]; // { dg-warning "\\\[-Warray-bounds" } |
| x = p[ 0]; |
| x = p[+9]; |
| } |
| |
| { |
| char *p = strcpy (a3, s); |
| x = p[-1]; // { dg-warning "\\\[-Warray-bounds" } |
| x = p[0]; |
| x = p[1]; |
| x = p[2]; |
| x = p[3]; // { dg-warning "\\\[-Warray-bounds" } |
| } |
| |
| { |
| char *p = strcpy (a5, s); |
| x = p[-1]; // { dg-warning "\\\[-Warray-bounds" } |
| sink (p[0], p[1], p[2], p[3], p[4]); |
| x = p[ 5]; // { dg-warning "\\\[-Warray-bounds" } |
| } |
| |
| { |
| char *p = strcpy (a5 + 1, s); |
| x = p[-2]; // { dg-warning "\\\[-Warray-bounds" } |
| sink (p[-1], p[0], p[1], p[2], p[3]); |
| x = p[4]; // { dg-warning "\\\[-Warray-bounds" } |
| } |
| |
| { |
| char *p = strcpy (a5 + 2, 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" } |
| } |
| |
| { |
| char *p = strcpy (a5 + 3, s); |
| x = p[-4]; // { dg-warning "\\\[-Warray-bounds" } |
| sink (p[-3], p[-2], p[-1], p[0], p[1]); |
| x = p[2]; // { dg-warning "\\\[-Warray-bounds" } |
| } |
| |
| { |
| char *p = strcpy (ax, a3); |
| p[-1] = 1; // { dg-warning "\\\[-Warray-bounds" } |
| sink (p[0], p[1], p[2], p[9], p[99]); |
| } |
| } |