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  }