| /* PR bootstrap/77676 - powerpc64 and powerpc64le stage2 bootstrap fail |
| Test case derived from the one submitted in the bug. It verifies |
| that the sprintf return value (or value range) optimization is not |
| performed for an unknown string. */ |
| /* { dg-do compile } */ |
| /* { dg-options "-O2 -Wall -Werror -fdump-tree-optimized -fprintf-return-value" } */ |
| |
| #define INT_MAX __INT_MAX__ |
| #define INT_MIN (-INT_MAX - 1) |
| |
| extern void string_eq_min_fail (); |
| extern void string_eq_max_fail (); |
| |
| extern void string_lt_0_fail (); |
| extern void string_eq_0_fail (); |
| extern void string_gt_0_fail (); |
| |
| void test_string_eq_min (char *d, const char *s) |
| { |
| int n = __builtin_sprintf (d, "%-s", s); |
| |
| /* Verify that the return value is NOT assumed NOT to be INT_MIN |
| or INT_MAX. (This is a white box test based on knowing that |
| the optimization computes its own values of the two constants.) */ |
| if (n == INT_MIN) string_eq_min_fail (); |
| } |
| |
| void test_string_eq_max (char *d, const char *s) |
| { |
| int n = __builtin_sprintf (d, "%-s", s); |
| |
| if (n == INT_MAX) string_eq_max_fail (); |
| } |
| |
| void test_string_lt_0 (char *d, const char *s) |
| { |
| int n = __builtin_sprintf (d, "%-s", s); |
| |
| /* The return value could be negative when strlen(s) is in excess |
| of 4095 (the maximum number of bytes a single directive is required |
| to handle). */ |
| if (n < 0) string_lt_0_fail (); |
| } |
| |
| void test_string_eq_0 (char *d, const char *s) |
| { |
| int n = __builtin_sprintf (d, "%-s", s); |
| |
| if (n == 0) string_eq_0_fail (); |
| } |
| |
| void test_string_gt_0 (char *d, const char *s) |
| { |
| int n = __builtin_sprintf (d, "%-s", s); |
| |
| if (n > 0) string_gt_0_fail (); |
| } |
| |
| /* { dg-final { scan-tree-dump-times "string_eq_min_fail" 1 "optimized" } } */ |
| /* { dg-final { scan-tree-dump-times "string_eq_max_fail" 1 "optimized" } } */ |
| /* { dg-final { scan-tree-dump-times "string_lt_0_fail" 1 "optimized" } } */ |
| /* { dg-final { scan-tree-dump-times "string_eq_0_fail" 1 "optimized" } } */ |
| /* { dg-final { scan-tree-dump-times "string_gt_0_fail" 1 "optimized" } } */ |