| /* PR c/84919 - bogus -Wrestrict on sprintf %p with destination as argument |
| { dg-do compile } |
| -O2 isn't strictly necessary but setting also verifies that the sprintf/ |
| strlen pass doesn't warn with non-constant arguments. |
| { dg-options "-O2 -Wall" } */ |
| |
| extern int sprintf (char* restrict, const char* restrict, ...); |
| extern int snprintf (char* restrict, __SIZE_TYPE__, const char* restrict, ...); |
| |
| char a[32]; |
| |
| void test_warn (char *p) |
| { |
| a[0] = 0; |
| sprintf (a, "a=%s", a); /* { dg-warning "-Wrestrict" } */ |
| |
| p = a; |
| char *q = p + 3; |
| sprintf (p, "a=%s", q); /* { dg-warning "-Wrestrict" } */ |
| } |
| |
| void test_nowarn_front_end (char *d) |
| { |
| sprintf (d, "%p", d); |
| snprintf (d, 32, "%p", d); |
| |
| sprintf (a, "p=%p", a); |
| snprintf (a, sizeof a, "%p", a); |
| } |
| |
| void test_nowarn_sprintf_pass (char *d) |
| { |
| char *q = d; |
| |
| sprintf (d, "p=%p", q); |
| snprintf (d, 32, "p=%p", q); |
| |
| q = a; |
| sprintf (a, "a=%p", q); |
| snprintf (a, sizeof a, "a=%p", q); |
| } |