(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
strlenopt-61.c
       1  /* PR tree-optimization/89688 - -Wstringop-overflow confused by const
       2     2D array of char
       3     { dg-do compile }
       4     { dg-options "-Wall -fdump-tree-gimple -fdump-tree-optimized" } */
       5  
       6  typedef __SIZE_TYPE__ size_t;
       7  
       8  size_t strlen (const char*);
       9  #define CAT(x, y) x ## y
      10  #define CONCAT(x, y) CAT (x, y)
      11  #define FAILNAME(name) CONCAT (call_ ## name ##_on_line_, __LINE__)
      12  
      13  #define FAIL(name) do {                         \
      14      extern __attribute__ ((noreturn)) void FAILNAME (name) (void);	\
      15      FAILNAME (name)();                          \
      16    } while (0)
      17  
      18  #define A(ref, len)					\
      19    if (strlen (ref) != len) FAIL (failure); else (void)0
      20  
      21  const char a3_4[3][4] = { { 1 }, { 1, 2 }, { 1, 2, 3 } };
      22  
      23  void test_a4_4 (void)
      24  {
      25    A (a3_4[0], 1);
      26    A (a3_4[1], 2);
      27    A (a3_4[2], 3);
      28  
      29    A (&a3_4[0][0], 1);
      30    A (&a3_4[0][1], 0);
      31    A (&a3_4[0][2], 0);
      32    A (&a3_4[0][3], 0);
      33  
      34    A (&a3_4[1][0], 2);
      35    A (&a3_4[1][1], 1);
      36    A (&a3_4[1][2], 0);
      37    A (&a3_4[1][3], 0);
      38  
      39    A (&a3_4[2][0], 3);
      40    A (&a3_4[2][1], 2);
      41    A (&a3_4[2][2], 1);
      42    A (&a3_4[2][3], 0);
      43  }
      44  
      45  
      46  const char a3_4_5[3][4][5] =
      47    {
      48     { { 1 }, { 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 } },
      49     { { 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 } },
      50     { { 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 }, { 1, 2 } },
      51    };
      52  
      53  void test_a3_4_5 (void)
      54  {
      55    A (a3_4_5[0][0], 1);
      56    A (a3_4_5[0][1], 2);
      57    A (a3_4_5[0][2], 3);
      58    A (a3_4_5[0][3], 4);
      59  
      60    A (a3_4_5[1][0], 2);
      61    A (a3_4_5[1][1], 3);
      62    A (a3_4_5[1][2], 4);
      63    A (a3_4_5[1][3], 1);
      64  
      65    A (a3_4_5[2][0], 3);
      66    A (a3_4_5[2][1], 4);
      67    A (a3_4_5[2][2], 1);
      68    A (a3_4_5[2][3], 2);
      69  }
      70  
      71  
      72  struct S
      73  {
      74    char a3[3];
      75    char a4_5[4][5];
      76  };
      77  
      78  const struct S sa4[4] =
      79    {
      80     { .a3 = { 0 },
      81       .a4_5 =
      82       {
      83        { 1 }, { 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 }
      84       }
      85     },
      86     { .a3 = { 1 },
      87       .a4_5 =
      88       {
      89        { 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 }
      90       }
      91     },
      92     { .a3 = { 1, 2 },
      93       .a4_5 =
      94       {
      95        { 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 }, { 1, 2 }
      96       }
      97     },
      98     { .a3 = { 1 },
      99       .a4_5 =
     100       {
     101        { 1, 2, 3, 4 }, "1", { 1, 2 }, "123"
     102       }
     103     }
     104    };
     105  
     106  void test_sa4 (void)
     107  {
     108    A (sa4[0].a3, 0);
     109    A (sa4[0].a4_5[0], 1);
     110    A (sa4[0].a4_5[1], 2);
     111    A (sa4[0].a4_5[2], 3);
     112    A (sa4[0].a4_5[3], 4);
     113  
     114    A (sa4[1].a3, 1);
     115    A (sa4[1].a4_5[0], 2);
     116    A (sa4[1].a4_5[1], 3);
     117    A (sa4[1].a4_5[2], 4);
     118    A (sa4[1].a4_5[3], 1);
     119  
     120    A (sa4[2].a3, 2);
     121    A (sa4[2].a4_5[0], 3);
     122    A (sa4[2].a4_5[1], 4);
     123    A (sa4[2].a4_5[2], 1);
     124    A (sa4[2].a4_5[3], 2);
     125  
     126    A (sa4[3].a3, 1);
     127    A (sa4[3].a4_5[0], 4);
     128    A (sa4[3].a4_5[1], 1);
     129    A (sa4[3].a4_5[2], 2);
     130    A (sa4[3].a4_5[3], 3);
     131  }
     132  
     133  
     134  struct T
     135  {
     136    struct S sa2[2];
     137    char a4[4];
     138  };
     139  
     140  const struct T ta2[2] =
     141    {
     142     [0] =
     143     {
     144      .sa2 =
     145      {
     146       [0] =
     147       { .a3 = { 0 },
     148         .a4_5 =
     149         {
     150  	{ 1 }, { 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 }
     151         }
     152       },
     153       [1] =
     154       { .a3 = { 1 },
     155         .a4_5 =
     156         {
     157  	{ 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 }
     158         }
     159       },
     160      },
     161      .a4 = "12"
     162     },
     163  
     164     [1] =
     165     {
     166      .sa2 =
     167      {
     168       [0] =
     169       { .a3 = { 1, 2 },
     170         .a4_5 =
     171         {
     172  	{ 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 }, { 1, 2 }
     173         }
     174       },
     175       { .a3 = { 1 },
     176         .a4_5 =
     177         {
     178  	{ 1, 2, 3, 4 }, "1", { 1, 2 }, "123"
     179         }
     180       }
     181      },
     182      .a4 = "123"
     183     }
     184    };
     185  
     186  void test_ta2 (void)
     187  {
     188    A (ta2[0].sa2[0].a3, 0);
     189    A (ta2[0].sa2[0].a4_5[0], 1);
     190    A (ta2[0].sa2[0].a4_5[1], 2);
     191    A (ta2[0].sa2[0].a4_5[2], 3);
     192    A (ta2[0].sa2[0].a4_5[3], 4);
     193  
     194    A (ta2[0].sa2[1].a3, 1);
     195    A (ta2[0].sa2[1].a4_5[0], 2);
     196    A (ta2[0].sa2[1].a4_5[1], 3);
     197    A (ta2[0].sa2[1].a4_5[2], 4);
     198    A (ta2[0].sa2[1].a4_5[3], 1);
     199  
     200    A (ta2[0].a4, 2);
     201  
     202    A (ta2[1].sa2[0].a3, 2);
     203    A (ta2[1].sa2[0].a4_5[0], 3);
     204    A (ta2[1].sa2[0].a4_5[1], 4);
     205    A (ta2[1].sa2[0].a4_5[2], 1);
     206    A (ta2[1].sa2[0].a4_5[3], 2);
     207  
     208    A (ta2[1].sa2[1].a3, 1);
     209    A (ta2[1].sa2[1].a4_5[0], 4);
     210    A (ta2[1].sa2[1].a4_5[1], 1);
     211    A (ta2[1].sa2[1].a4_5[2], 2);
     212    A (ta2[1].sa2[1].a4_5[3], 3);
     213  
     214    A (ta2[1].a4, 3);
     215  }
     216  
     217  /* { dg-final { scan-tree-dump-not "failure" "optimized" } }
     218     { dg-final { scan-tree-dump-not "strlen1" "gimple" } } */