(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.c-torture/
execute/
strlen-3.c
       1  /* PR tree-optimization/86532 - Wrong code due to a wrong strlen folding
       2     starting with r262522
       3     Exercise strlen() with a multi-dimensional array of strings with
       4     embedded nuls.  */
       5  
       6  extern __SIZE_TYPE__ strlen (const char*);
       7  
       8  static const char a[2][3][9] = {
       9    { "1", "1\0002" },
      10    { "12\0003", "123\0004" }
      11  };
      12  
      13  volatile int v0 = 0;
      14  volatile int v1 = 1;
      15  volatile int v2 = 2;
      16  volatile int v3 = 3;
      17  volatile int v4 = 4;
      18  volatile int v5 = 5;
      19  volatile int v6 = 6;
      20  volatile int v7 = 7;
      21  
      22  #define A(expr)								\
      23    ((expr) ? (void)0 : (__builtin_printf ("assertion on line %i: %s\n",	\
      24  					 __LINE__, #expr),		\
      25  		       __builtin_abort ()))
      26  
      27  void test_array_ref (void)
      28  {
      29    int i0 = 0;
      30    int i1 = i0 + 1;
      31    int i2 = i1 + 1;
      32    int i3 = i2 + 1;
      33    int i4 = i3 + 1;
      34    int i5 = i4 + 1;
      35    int i6 = i5 + 1;
      36    int i7 = i6 + 1;
      37  
      38    A (strlen (a[0][0]) == 1);
      39    A (strlen (a[0][1]) == 1);
      40  
      41    A (strlen (a[1][0]) == 2);
      42    A (strlen (a[1][1]) == 3);
      43  
      44    A (strlen (&a[0][0][0]) == 1);
      45    A (strlen (&a[0][1][0]) == 1);
      46  
      47    A (strlen (&a[1][0][0]) == 2);
      48    A (strlen (&a[1][1][0]) == 3);
      49  
      50    A (strlen (&a[0][0][0] + 1) == 0);
      51    A (strlen (&a[0][1][0] + 1) == 0);
      52    A (strlen (&a[0][1][0] + 2) == 1);
      53    A (strlen (&a[0][1][0] + 3) == 0);
      54    A (strlen (&a[0][1][0] + 7) == 0);
      55  
      56    A (strlen (&a[1][0][0] + 1) == 1);
      57    A (strlen (&a[1][1][0] + 1) == 2);
      58    A (strlen (&a[1][1][0] + 2) == 1);
      59    A (strlen (&a[1][1][0] + 7) == 0);
      60  
      61  
      62    A (strlen (a[i0][i0]) == 1);
      63    A (strlen (a[i0][i1]) == 1);
      64  
      65    A (strlen (a[i1][i0]) == 2);
      66    A (strlen (a[i1][i1]) == 3);
      67  
      68    A (strlen (&a[i0][i0][i0]) == 1);
      69    A (strlen (&a[i0][i1][i0]) == 1);
      70    A (strlen (&a[i0][i1][i1]) == 0);
      71    A (strlen (&a[i0][i1][i2]) == 1);
      72    A (strlen (&a[i0][i1][i3]) == 0);
      73    A (strlen (&a[i0][i1][i3]) == 0);
      74  
      75    A (strlen (&a[i1][i0][i0]) == 2);
      76    A (strlen (&a[i1][i1][i0]) == 3);
      77    A (strlen (&a[i1][i1][i1]) == 2);
      78    A (strlen (&a[i1][i1][i2]) == 1);
      79    A (strlen (&a[i1][i1][i3]) == 0);
      80    A (strlen (&a[i1][i1][i4]) == 1);
      81    A (strlen (&a[i1][i1][i5]) == 0);
      82    A (strlen (&a[i1][i1][i6]) == 0);
      83    A (strlen (&a[i1][i1][i7]) == 0);
      84  
      85    A (strlen (&a[i0][i0][i0] + i1) == 0);
      86    A (strlen (&a[i0][i1][i0] + i1) == 0);
      87    A (strlen (&a[i0][i1][i0] + i7) == 0);
      88  
      89    A (strlen (&a[i1][i0][i0] + i1) == 1);
      90    A (strlen (&a[i1][i1][i0] + i1) == 2);
      91    A (strlen (&a[i1][i1][i0] + i2) == 1);
      92    A (strlen (&a[i1][i1][i0] + i3) == 0);
      93    A (strlen (&a[i1][i1][i0] + i4) == 1);
      94    A (strlen (&a[i1][i1][i0] + i5) == 0);
      95    A (strlen (&a[i1][i1][i0] + i6) == 0);
      96    A (strlen (&a[i1][i1][i0] + i7) == 0);
      97  
      98  
      99    A (strlen (a[i0][i0]) == 1);
     100    A (strlen (a[i0][i1]) == 1);
     101  
     102    A (strlen (a[i1][i0]) == 2);
     103    A (strlen (a[i1][i1]) == 3);
     104  
     105    A (strlen (&a[i0][i0][i0]) == 1);
     106    A (strlen (&a[i0][i1][i0]) == 1);
     107  
     108    A (strlen (&a[i1][i0][i0]) == 2);
     109    A (strlen (&a[i1][i1][i0]) == 3);
     110  
     111    A (strlen (&a[i0][i0][i0] + v1) == 0);
     112    A (strlen (&a[i0][i0][i0] + v2) == 0);
     113    A (strlen (&a[i0][i0][i0] + v7) == 0);
     114  
     115    A (strlen (&a[i0][i1][i0] + v1) == 0);
     116    A (strlen (&a[i0][i1][i0] + v2) == 1);
     117    A (strlen (&a[i0][i1][i0] + v3) == 0);
     118  
     119    A (strlen (&a[i1][i0][i0] + v1) == 1);
     120    A (strlen (&a[i1][i1][i0] + v1) == 2);
     121    A (strlen (&a[i1][i1][i0] + v2) == 1);
     122    A (strlen (&a[i1][i1][i0] + v3) == 0);
     123    A (strlen (&a[i1][i1][i0] + v4) == 1);
     124    A (strlen (&a[i1][i1][i0] + v5) == 0);
     125    A (strlen (&a[i1][i1][i0] + v6) == 0);
     126    A (strlen (&a[i1][i1][i0] + v7) == 0);
     127  }
     128  
     129  int main (void)
     130  {
     131    test_array_ref ();
     132  }