/* 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)""); }