modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/builtins/strnlen.c (about) 1 /* PR tree-optimization/81384 - built-in form of strnlen missing 2 Test to verify that strnlen built-in expansion works correctly. */ 3 4 #define PTRDIFF_MAX __PTRDIFF_MAX__ 5 #define SIZE_MAX __SIZE_MAX__ 6 #define NOIPA __attribute__ ((noipa)) 7 8 typedef __SIZE_TYPE__ size_t; 9 10 extern void abort (void); 11 extern size_t strnlen (const char *, size_t); 12 13 #define A(expr) \ 14 ((expr) ? (void)0 \ 15 : (__builtin_printf ("assertion on line %i failed: %s\n", \ 16 __LINE__, #expr), \ 17 abort ())) 18 19 NOIPA void test_strnlen_str_cst (void) 20 { 21 A (strnlen ("", 0) == 0); 22 A (strnlen ("", 1) == 0); 23 A (strnlen ("", 9) == 0); 24 A (strnlen ("", PTRDIFF_MAX) == 0); 25 A (strnlen ("", SIZE_MAX) == 0); 26 A (strnlen ("", -1) == 0); 27 28 A (strnlen ("1", 0) == 0); 29 A (strnlen ("1", 1) == 1); 30 A (strnlen ("1", 9) == 1); 31 A (strnlen ("1", PTRDIFF_MAX) == 1); 32 A (strnlen ("1", SIZE_MAX) == 1); 33 A (strnlen ("1", -2) == 1); 34 35 A (strnlen ("123", 0) == 0); 36 A (strnlen ("123", 1) == 1); 37 A (strnlen ("123", 2) == 2); 38 A (strnlen ("123", 3) == 3); 39 A (strnlen ("123", 9) == 3); 40 A (strnlen ("123", PTRDIFF_MAX) == 3); 41 A (strnlen ("123", SIZE_MAX) == 3); 42 A (strnlen ("123", -2) == 3); 43 } 44 45 NOIPA void test_strnlen_str_range (size_t x) 46 { 47 size_t r_0_3 = x & 3; 48 size_t r_1_3 = r_0_3 | 1; 49 size_t r_2_3 = r_0_3 | 2; 50 51 A (strnlen ("", r_0_3) == 0); 52 A (strnlen ("1", r_0_3) <= 1); 53 A (strnlen ("12", r_0_3) <= 2); 54 A (strnlen ("123", r_0_3) <= 3); 55 A (strnlen ("1234", r_0_3) <= 3); 56 57 A (strnlen ("", r_1_3) == 0); 58 A (strnlen ("1", r_1_3) == 1); 59 A (strnlen ("12", r_1_3) <= 2); 60 A (strnlen ("123", r_1_3) <= 3); 61 A (strnlen ("1234", r_1_3) <= 3); 62 63 A (strnlen ("", r_2_3) == 0); 64 A (strnlen ("1", r_2_3) == 1); 65 A (strnlen ("12", r_2_3) == 2); 66 A (strnlen ("123", r_2_3) <= 3); 67 A (strnlen ("1234", r_2_3) <= 3); 68 } 69 70 NOIPA void test_strnlen_str_range_side_effect (size_t x) 71 { 72 size_t r_0_3 = x & 3; 73 size_t r_1_3 = r_0_3 | 1; 74 size_t r_2_3 = r_0_3 | 2; 75 size_t n = r_2_3; 76 77 int i = 0; 78 79 A (strnlen ("1234" + i++, n) <= 3); 80 A (i == 1); 81 82 A (strnlen ("1234", n++) <= 3); 83 A (n == r_2_3 + 1); 84 } 85 86 void 87 main_test (void) 88 { 89 test_strnlen_str_cst (); 90 test_strnlen_str_range ((size_t)""); 91 test_strnlen_str_range_side_effect ((size_t)""); 92 }