blob: 46a04a79ee247c57584bc3effb49a423a0a209ac [file] [log] [blame]
/* PR tree-optimization/81384 - built-in form of strnlen missing
Test to verify that strnlen built-in expansion works correctly. */
#define PTRDIFF_MAX __PTRDIFF_MAX__
#define SIZE_MAX __SIZE_MAX__
#define NOIPA __attribute__ ((noipa))
typedef __SIZE_TYPE__ size_t;
extern void abort (void);
extern size_t strnlen (const char *, size_t);
#define A(expr) \
((expr) ? (void)0 \
: (__builtin_printf ("assertion on line %i failed: %s\n", \
__LINE__, #expr), \
abort ()))
NOIPA void test_strnlen_str_cst (void)
{
A (strnlen ("", 0) == 0);
A (strnlen ("", 1) == 0);
A (strnlen ("", 9) == 0);
A (strnlen ("", PTRDIFF_MAX) == 0);
A (strnlen ("", SIZE_MAX) == 0);
A (strnlen ("", -1) == 0);
A (strnlen ("1", 0) == 0);
A (strnlen ("1", 1) == 1);
A (strnlen ("1", 9) == 1);
A (strnlen ("1", PTRDIFF_MAX) == 1);
A (strnlen ("1", SIZE_MAX) == 1);
A (strnlen ("1", -2) == 1);
A (strnlen ("123", 0) == 0);
A (strnlen ("123", 1) == 1);
A (strnlen ("123", 2) == 2);
A (strnlen ("123", 3) == 3);
A (strnlen ("123", 9) == 3);
A (strnlen ("123", PTRDIFF_MAX) == 3);
A (strnlen ("123", SIZE_MAX) == 3);
A (strnlen ("123", -2) == 3);
}
NOIPA void test_strnlen_str_range (size_t x)
{
size_t r_0_3 = x & 3;
size_t r_1_3 = r_0_3 | 1;
size_t r_2_3 = r_0_3 | 2;
A (strnlen ("", r_0_3) == 0);
A (strnlen ("1", r_0_3) <= 1);
A (strnlen ("12", r_0_3) <= 2);
A (strnlen ("123", r_0_3) <= 3);
A (strnlen ("1234", r_0_3) <= 3);
A (strnlen ("", r_1_3) == 0);
A (strnlen ("1", r_1_3) == 1);
A (strnlen ("12", r_1_3) <= 2);
A (strnlen ("123", r_1_3) <= 3);
A (strnlen ("1234", r_1_3) <= 3);
A (strnlen ("", r_2_3) == 0);
A (strnlen ("1", r_2_3) == 1);
A (strnlen ("12", r_2_3) == 2);
A (strnlen ("123", r_2_3) <= 3);
A (strnlen ("1234", r_2_3) <= 3);
}
NOIPA void test_strnlen_str_range_side_effect (size_t x)
{
size_t r_0_3 = x & 3;
size_t r_1_3 = r_0_3 | 1;
size_t r_2_3 = r_0_3 | 2;
size_t n = r_2_3;
int i = 0;
A (strnlen ("1234" + i++, n) <= 3);
A (i == 1);
A (strnlen ("1234", n++) <= 3);
A (n == r_2_3 + 1);
}
void
main_test (void)
{
test_strnlen_str_cst ();
test_strnlen_str_range ((size_t)"");
test_strnlen_str_range_side_effect ((size_t)"");
}