modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/strlen-2.c (about)

     1  /* PR tree-optimization/86532 - Wrong code due to a wrong strlen folding  */
     2  
     3  extern __SIZE_TYPE__ strlen (const char*);
     4  
     5  static const char a[2][3] = { "1", "12" };
     6  static const char b[2][2][5] = { { "1", "12" }, { "123", "1234" } };
     7  
     8  volatile int v0 = 0;
     9  volatile int v1 = 1;
    10  volatile int v2 = 2;
    11  
    12  #define A(expr)								\
    13    ((expr) ? (void)0 : (__builtin_printf ("assertion on line %i: %s\n",	\
    14  					 __LINE__, #expr),		\
    15  		       __builtin_abort ()))
    16  
    17  void test_array_ref_2_3 (void)
    18  {
    19    A (strlen (a[v0]) == 1);
    20    A (strlen (&a[v0][v0]) == 1);
    21    A (strlen (&a[0][v0]) == 1);
    22    A (strlen (&a[v0][0]) == 1);
    23  
    24    A (strlen (a[v1]) == 2);
    25    A (strlen (&a[v1][0]) == 2);
    26    A (strlen (&a[1][v0]) == 2);
    27    A (strlen (&a[v1][v0]) == 2);
    28  
    29    A (strlen (&a[v1][1]) == 1);
    30    A (strlen (&a[v1][1]) == 1);
    31  
    32    A (strlen (&a[v1][2]) == 0);
    33    A (strlen (&a[v1][v2]) == 0);
    34  
    35    int i0 = 0;
    36    int i1 = i0 + 1;
    37    int i2 = i1 + 1;
    38  
    39    A (strlen (a[v0]) == 1);
    40    A (strlen (&a[v0][v0]) == 1);
    41    A (strlen (&a[i0][v0]) == 1);
    42    A (strlen (&a[v0][i0]) == 1);
    43  
    44    A (strlen (a[v1]) == 2);
    45    A (strlen (&a[v1][i0]) == 2);
    46    A (strlen (&a[i1][v0]) == 2);
    47    A (strlen (&a[v1][v0]) == 2);
    48  
    49    A (strlen (&a[v1][i1]) == 1);
    50    A (strlen (&a[v1][i1]) == 1);
    51  
    52    A (strlen (&a[v1][i2]) == 0);
    53    A (strlen (&a[v1][v2]) == 0);
    54  }
    55  
    56  void test_array_off_2_3 (void)
    57  {
    58    A (strlen (a[0] + 0) == 1);
    59    A (strlen (a[0] + v0) == 1);
    60    A (strlen (a[v0] + 0) == 1);
    61    A (strlen (a[v0] + v0) == 1);
    62  
    63    A (strlen (a[v1] + 0) == 2);
    64    A (strlen (a[1] + v0) == 2);
    65    A (strlen (a[v1] + 0) == 2);
    66    A (strlen (a[v1] + v0) == 2);
    67  
    68    A (strlen (a[v1] + 1) == 1);
    69    A (strlen (a[v1] + v1) == 1);
    70  
    71    A (strlen (a[v1] + 2) == 0);
    72    A (strlen (a[v1] + v2) == 0);
    73  
    74    int i0 = 0;
    75    int i1 = i0 + 1;
    76    int i2 = i1 + 1;
    77  
    78    A (strlen (a[i0] + i0) == 1);
    79    A (strlen (a[i0] + v0) == 1);
    80    A (strlen (a[v0] + i0) == 1);
    81    A (strlen (a[v0] + v0) == 1);
    82  
    83    A (strlen (a[v1] + i0) == 2);
    84    A (strlen (a[i1] + v0) == 2);
    85    A (strlen (a[v1] + i0) == 2);
    86    A (strlen (a[v1] + v0) == 2);
    87  
    88    A (strlen (a[v1] + i1) == 1);
    89    A (strlen (a[v1] + v1) == 1);
    90  
    91    A (strlen (a[v1] + i2) == 0);
    92    A (strlen (a[v1] + v2) == 0);
    93  }
    94  
    95  void test_array_ref_2_2_5 (void)
    96  {
    97    A (strlen (b[0][v0]) == 1);
    98    A (strlen (b[v0][0]) == 1);
    99  
   100    A (strlen (&b[0][0][v0]) == 1);
   101    A (strlen (&b[0][v0][0]) == 1);
   102    A (strlen (&b[v0][0][0]) == 1);
   103  
   104    A (strlen (&b[0][v0][v0]) == 1);
   105    A (strlen (&b[v0][0][v0]) == 1);
   106    A (strlen (&b[v0][v0][0]) == 1);
   107  
   108    A (strlen (b[0][v1]) == 2);
   109    A (strlen (b[v1][0]) == 3);
   110  
   111    A (strlen (&b[0][0][v1]) == 0);
   112    A (strlen (&b[0][v1][0]) == 2);
   113    A (strlen (&b[v0][0][0]) == 1);
   114  
   115    A (strlen (&b[0][v0][v0]) == 1);
   116    A (strlen (&b[v0][0][v0]) == 1);
   117    A (strlen (&b[v0][v0][0]) == 1);
   118  
   119    A (strlen (&b[0][v1][v1]) == 1);
   120    A (strlen (&b[v1][0][v1]) == 2);
   121    A (strlen (&b[v1][v1][0]) == 4);
   122    A (strlen (&b[v1][v1][1]) == 3);
   123    A (strlen (&b[v1][v1][2]) == 2);
   124  
   125    int i0 = 0;
   126    int i1 = i0 + 1;
   127    int i2 = i1 + 1;
   128  
   129    A (strlen (b[i0][v0]) == 1);
   130    A (strlen (b[v0][i0]) == 1);
   131  
   132    A (strlen (&b[i0][i0][v0]) == 1);
   133    A (strlen (&b[i0][v0][i0]) == 1);
   134    A (strlen (&b[v0][i0][i0]) == 1);
   135  
   136    A (strlen (&b[i0][v0][v0]) == 1);
   137    A (strlen (&b[v0][i0][v0]) == 1);
   138    A (strlen (&b[v0][v0][i0]) == 1);
   139  
   140    A (strlen (b[i0][v1]) == 2);
   141    A (strlen (b[v1][i0]) == 3);
   142  
   143    A (strlen (&b[i0][i0][v1]) == 0);
   144    A (strlen (&b[i0][v1][i0]) == 2);
   145    A (strlen (&b[v0][i0][i0]) == 1);
   146  
   147    A (strlen (&b[i0][v0][v0]) == 1);
   148    A (strlen (&b[v0][i0][v0]) == 1);
   149    A (strlen (&b[v0][v0][i0]) == 1);
   150  
   151    A (strlen (&b[i0][v1][v1]) == 1);
   152    A (strlen (&b[v1][i0][v1]) == 2);
   153    A (strlen (&b[v1][v1][i0]) == 4);
   154    A (strlen (&b[v1][v1][i1]) == 3);
   155    A (strlen (&b[v1][v1][i2]) == 2);
   156  }
   157  
   158  void test_array_off_2_2_5 (void)
   159  {
   160    A (strlen (b[0][0] + v0) == 1);
   161    A (strlen (b[0][v0] + v0) == 1);
   162    A (strlen (b[v0][0] + v0) == 1);
   163    A (strlen (b[v0][v0] + v0) == 1);
   164  
   165    A (strlen (b[0][0] + v1) == 0);
   166    A (strlen (b[0][v1] + 0) == 2);
   167    A (strlen (b[v0][0] + 0) == 1);
   168  
   169    A (strlen (b[0][v0] + v0) == 1);
   170    A (strlen (b[v0][0] + v0) == 1);
   171    A (strlen (b[v0][v0] + 0) == 1);
   172  
   173    A (strlen (b[0][v1] + v1) == 1);
   174    A (strlen (b[v1][0] + v1) == 2);
   175    A (strlen (b[v1][v1] + 0) == 4);
   176    A (strlen (b[v1][v1] + 1) == 3);
   177    A (strlen (b[v1][v1] + 2) == 2);
   178  
   179    int i0 = 0;
   180    int i1 = i0 + 1;
   181    int i2 = i1 + 1;
   182  
   183    A (strlen (b[i0][i0] + v0) == 1);
   184    A (strlen (b[i0][v0] + v0) == 1);
   185    A (strlen (b[v0][i0] + v0) == 1);
   186    A (strlen (b[v0][v0] + v0) == 1);
   187  
   188    A (strlen (b[i0][i0] + v1) == 0);
   189    A (strlen (b[i0][v1] + i0) == 2);
   190    A (strlen (b[v0][i0] + i0) == 1);
   191  
   192    A (strlen (b[i0][v0] + v0) == 1);
   193    A (strlen (b[v0][i0] + v0) == 1);
   194    A (strlen (b[v0][v0] + i0) == 1);
   195  
   196    A (strlen (b[i0][v1] + v1) == 1);
   197    A (strlen (b[v1][i0] + v1) == 2);
   198    A (strlen (b[v1][v1] + i0) == 4);
   199    A (strlen (b[v1][v1] + i1) == 3);
   200    A (strlen (b[v1][v1] + i2) == 2);
   201  }
   202  
   203  int main ()
   204  {
   205    test_array_ref_2_3 ();
   206    test_array_off_2_3 ();
   207  
   208    test_array_ref_2_2_5 ();
   209    test_array_off_2_2_5 ();
   210  }