| /* PR tree-optimization/79327 - wrong code at -O2 and -fprintf-return-value |
| { dg-do run } |
| { dg-options "-O2 -Wall" } */ |
| |
| volatile int a, b = -1; |
| char buf[64]; |
| |
| #define FMT "%+03d%02d" |
| const char *volatile fmt = FMT; |
| |
| int main () |
| { |
| int c = a; |
| int d = b; |
| if (c >= -35791395 && c < 35791394 && d >= -1 && d < __INT_MAX__) |
| { |
| /* In the following the range of return values can be computed |
| by GCC. */ |
| int n1 = __builtin_sprintf (buf, FMT, c + 1, d + 1); |
| if (n1 > 7) |
| __builtin_abort (); |
| |
| /* Here GCC can't see the format string so the return value |
| must be computed by a libc call. */ |
| int n2 = __builtin_sprintf (buf, fmt, c + 1, d + 1); |
| |
| if (n1 != n2) |
| __builtin_abort (); |
| } |
| return 0; |
| } |