(root)/
gcc-13.2.0/
gcc/
testsuite/
c-c++-common/
array-1.c
       1  // PR c++/90947 - Simple lookup table of array of strings is miscompiled
       2  // { dg-do compile }
       3  // { dg-options "-O1 -fdump-tree-optimized" }
       4  
       5  #define assert(expr) ((expr) ? (void)0 : __builtin_abort ())
       6  
       7  void pr90947 (void)
       8  {
       9    int vecsize = 4;
      10    int index = 0;
      11    static const char *a[4][4] =
      12      {
      13       { ".x", ".y", ".z", ".w" },
      14       { ".xy", ".yz", ".zw", 0 },
      15       { ".xyz", ".yzw", 0, 0 },
      16       { "", 0, 0, 0 },
      17      };
      18  
      19    assert (vecsize >= 1 && vecsize <= 4);
      20    assert (index >= 0 && index < 4);
      21    assert (a[vecsize - 1][index]);
      22  }
      23  
      24  void f_a1_1 (void)
      25  {
      26    {
      27      const char* a[1][1] = { { 0 } };
      28      assert (0 == a[0][0]);
      29    }
      30    {
      31      const char* a[1][1] = { { "" } };
      32      assert ('\0' == *a[0][0]);
      33    }
      34  }
      35  
      36  void f_a2_1 (void)
      37  {
      38    {
      39      const char* a[2][1] = { { "" }, { "" } };
      40      assert ('\0' == *a[0][0] && '\0' == *a[1][0]);
      41    }
      42    {
      43      const char* a[2][1] = { { 0 }, { "" } };
      44      assert (0 == a[0][0] && '\0' == *a[1][0]);
      45    }
      46    {
      47      const char* a[2][1] = { { }, { "" } };
      48      assert (0 == a[0][0] && '\0' == *a[1][0]);
      49    }
      50  }
      51  
      52  void f_a2_2 (void)
      53  {
      54    {
      55      const char* a[2][2] = { { "", "" }, { "", "" } };
      56      assert ('\0' == *a[0][0] && '\0' == *a[0][1]);
      57      assert ('\0' == *a[1][0] && '\0' == *a[1][1]);
      58    }
      59    {
      60      const char* a[2][2] = { { "", "" }, { "", 0 } };
      61      assert ('\0' == *a[0][0] && '\0' == *a[0][1]);
      62      assert ('\0' == *a[1][0] && 0 == a[1][1]);
      63    }
      64    {
      65      const char* a[2][2] = { { "", "" }, { "" } };
      66      assert ('\0' == *a[0][0] && '\0' == *a[0][1]);
      67      assert ('\0' == *a[1][0] && 0 == a[1][1]);
      68    }
      69    {
      70      const char* a[2][2] = { { "", "" }, { 0, "" } };
      71      assert ('\0' == *a[0][0] && '\0' == *a[0][1]);
      72      assert (0 == a[1][0] && '\0' == *a[1][1]);
      73    }
      74    {
      75      const char* a[2][2] = { { "", 0 }, { 0, "" } };
      76      assert ('\0' == *a[0][0] && 0 == a[0][1]);
      77      assert (0 == a[1][0] && '\0' == *a[1][1]);
      78    }
      79    {
      80      const char* a[2][2] = { { 0, 0 }, { 0, "" } };
      81      assert (0 == a[0][0] && 0 == a[0][1]);
      82      assert (0 == a[1][0] && '\0' == *a[1][1]);
      83    }
      84    {
      85      const char* a[2][2] = { { 0 }, { 0, "" } };
      86      assert (0 == a[0][0] && 0 == a[0][1]);
      87      assert (0 == a[1][0] && '\0' == *a[1][1]);
      88    }
      89    {
      90      const char* a[2][2] = { { }, { 0, "" } };
      91      assert (0 == a[0][0] && 0 == a[0][1]);
      92      assert (0 == a[1][0] && '\0' == *a[1][1]);
      93    }
      94  }
      95  
      96  void f_a2_2_2 (void)
      97  {
      98    {
      99      const char* a[2][2][2] =
     100        { { { "", "" }, { "", "" } }, { { "", "" }, { "", "" } } };
     101  
     102      assert ('\0' == *a[0][0][0] && '\0' == *a[0][0][1]);
     103      assert ('\0' == *a[0][1][0] && '\0' == *a[0][1][1]);
     104      assert ('\0' == *a[1][0][0] && '\0' == *a[1][0][1]);
     105      assert ('\0' == *a[1][1][0] && '\0' == *a[1][1][1]);
     106    }
     107  
     108    {
     109      const char* a[2][2][2] =
     110        { { { "", "" }, { "", "" } }, { { "", "" }, { 0, "" } } };
     111  
     112      assert ('\0' == *a[0][0][0] && '\0' == *a[0][0][1]);
     113      assert ('\0' == *a[0][1][0] && '\0' == *a[0][1][1]);
     114      assert ('\0' == *a[1][0][0] && '\0' == *a[1][0][1]);
     115      assert (0 == a[1][1][0] && '\0' == *a[1][1][1]);
     116    }
     117  
     118    {
     119      const char* a[2][2][2] =
     120        { { { "", "" }, { "", "" } }, { { 0, 0 }, { 0, "" } } };
     121  
     122      assert ('\0' == *a[0][0][0] && '\0' == *a[0][0][1]);
     123      assert ('\0' == *a[0][1][0] && '\0' == *a[0][1][1]);
     124      assert (0 == a[1][0][0] && 0 == a[1][0][1]);
     125      assert (0 == a[1][1][0] && '\0' == *a[1][1][1]);
     126    }
     127  
     128    {
     129      const char* a[2][2][2] =
     130        { { { "", "" }, { 0, 0 } }, { { 0, 0 }, { 0, "" } } };
     131  
     132      assert ('\0' == *a[0][0][0] && '\0' == *a[0][0][1]);
     133      assert (0 == a[0][1][0] && 0 == a[0][1][1]);
     134      assert (0 == a[1][0][0] && 0 == a[1][0][1]);
     135      assert (0 == a[1][1][0] && '\0' == *a[1][1][1]);
     136    }
     137  
     138    {
     139      const char* a[2][2][2] =
     140        { { { 0, 0 }, { 0, 0 } }, { { 0, 0 }, { 0, "" } } };
     141  
     142      assert (0 == a[0][0][0] && 0 == a[0][0][1]);
     143      assert (0 == a[0][1][0] && 0 == a[0][1][1]);
     144      assert (0 == a[1][0][0] && 0 == a[1][0][1]);
     145      assert (0 == a[1][1][0] && '\0' == *a[1][1][1]);
     146    }
     147  
     148    {
     149      const char* a[2][2][2] =
     150        { { { }, { } }, { { }, { 0, "" } } };
     151  
     152      assert (0 == a[0][0][0] && 0 == a[0][0][1]);
     153      assert (0 == a[0][1][0] && 0 == a[0][1][1]);
     154      assert (0 == a[1][0][0] && 0 == a[1][0][1]);
     155      assert (0 == a[1][1][0] && '\0' == *a[1][1][1]);
     156    }
     157  }
     158  
     159  void f_sa2_2_2 (void)
     160  {
     161    struct S { const char a[2], *s, c; };
     162  
     163    {
     164      const struct S a[2][2][2] = {
     165        { },
     166        {
     167          { { }, { "", "" } },
     168          { }
     169        }
     170      };
     171  
     172      assert ('\0' == *a[0][0][0].a && 0 == a[0][0][0].s && 0 == a[0][0][0].c);
     173      assert ('\0' == *a[0][0][1].a && 0 == a[0][0][1].s && 0 == a[0][0][1].c);
     174      assert ('\0' == *a[0][1][0].a && 0 == a[0][1][0].s && 0 == a[0][1][0].c);
     175      assert ('\0' == *a[0][1][1].a && 0 == a[0][1][1].s && 0 == a[0][1][1].c);
     176  
     177      assert ('\0' == *a[1][0][0].a && 0 == a[1][0][0].s && 0 == a[1][0][0].c);
     178      assert ('\0' == *a[1][0][1].a && '\0' == *a[1][0][1].s && 0 == a[1][0][1].c);
     179      assert ('\0' == *a[1][1][0].a && 0 == a[1][1][0].s && 0 == a[1][1][0].c);
     180      assert ('\0' == *a[1][1][1].a && 0 == a[1][1][1].s && 0 == a[1][1][1].c);
     181    }
     182  
     183    {
     184      const struct S a[2][2][2] = {
     185        { },
     186        {
     187          { { } },
     188          { { "", "" } }
     189        }
     190      };
     191  
     192      assert ('\0' == *a[0][0][0].a && 0 == a[0][0][0].s);
     193      assert ('\0' == *a[0][0][1].a && 0 == a[0][0][1].s);
     194      assert ('\0' == *a[0][1][0].a && 0 == a[0][1][0].s);
     195      assert ('\0' == *a[0][1][1].a && 0 == a[0][1][1].s);
     196  
     197      assert ('\0' == *a[1][0][0].a && 0 == a[1][0][0].s);
     198      assert ('\0' == *a[1][0][1].a && 0 == a[1][0][1].s);
     199      assert ('\0' == *a[1][1][0].a && '\0' == *a[1][1][0].s);
     200      assert ('\0' == *a[1][1][1].a && 0 == a[1][1][1].s);
     201    }
     202  
     203    {
     204      const struct S a[2][2][2] = {
     205        { },
     206        {
     207          { { }, { } },
     208          { { }, { "", "", 0 } }
     209        }
     210      };
     211  
     212      assert ('\0' == *a[0][0][0].a && 0 == a[0][0][0].s);
     213      assert ('\0' == *a[0][0][1].a && 0 == a[0][0][1].s);
     214      assert ('\0' == *a[0][1][0].a && 0 == a[0][1][0].s);
     215      assert ('\0' == *a[0][1][1].a && 0 == a[0][1][1].s);
     216  
     217      assert ('\0' == *a[1][0][0].a && 0 == a[1][0][0].s);
     218      assert ('\0' == *a[1][0][1].a && 0 == a[1][0][1].s);
     219      assert ('\0' == *a[1][1][0].a && 0 == a[1][1][0].s);
     220      assert ('\0' == *a[1][1][1].a && '\0' == *a[1][1][1].s);
     221    }
     222  
     223    {
     224      const struct S a[2][2][2] = {
     225        {
     226         { { { 0 }, 0, 0 }, { { 0 } , 0, 0 } },
     227         { { { 0 }, 0, 0 }, { { 0 } , 0, 0 } },
     228        },
     229        {
     230         { { { 0 }, 0, 0 }, { { 0 } , 0, 0 } },
     231         { { }, { "", "", 0 } }
     232        }
     233      };
     234  
     235      assert ('\0' == *a[0][0][0].a && 0 == a[0][0][0].s);
     236      assert ('\0' == *a[0][0][1].a && 0 == a[0][0][1].s);
     237      assert ('\0' == *a[0][1][0].a && 0 == a[0][1][0].s);
     238      assert ('\0' == *a[0][1][1].a && 0 == a[0][1][1].s);
     239  
     240      assert ('\0' == *a[1][0][0].a && 0 == a[1][0][0].s);
     241      assert ('\0' == *a[1][0][1].a && 0 == a[1][0][1].s);
     242      assert ('\0' == *a[1][1][0].a && 0 == a[1][1][0].s);
     243      assert ('\0' == *a[1][1][1].a && '\0' == *a[1][1][1].s);
     244    }
     245  }
     246  
     247  // { dg-final { scan-tree-dump-not "abort" "optimized" } }