blob: ec55f2673184e09da425e4eed909c80223003374 [file] [log] [blame]
/* 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" } } */