(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
Wrestrict-11.c
       1  /* PR tree-optimization/84526 - ICE in generic_overlap
       2     Unrelated to the ICE but rather to PR 84095 that introduced it, verify
       3     that calls to strncpy involving multidimensional arrays of structs don't
       4     trigger false positive -Wrestrict warnings.
       5     { dg-do compile }
       6     { dg-options "-O2 -Wrestrict -ftrack-macro-expansion=0" }
       7     { dg-skip-if "too many arguments in function call" { bpf-*-* } } */
       8  
       9  typedef __SIZE_TYPE__ size_t;
      10  
      11  extern char* strcpy (char*, const char*);
      12  
      13  struct MemArrays
      14  {
      15    char a1[4];
      16    char a2[4][4];
      17    char a3[4][4][4];
      18  } ma1[4], ma2[4][4], ma3[4][4][4];
      19  
      20  #define T(dst, src) do {				\
      21      strcpy (src, "123");				\
      22      strcpy (dst, src);					\
      23    } while (0)
      24  
      25  
      26  void test_ma1_cst (const char *s)
      27  {
      28    T (ma1[0].a1, ma1[0].a1);           /* { dg-warning "\\\[-Wrestrict]" } */
      29    T (ma1[0].a1, ma1[1].a1);
      30    T (ma1[0].a1, ma1[2].a1);
      31    T (ma1[0].a1, ma1[3].a1);
      32  
      33    T (ma1[0].a1, ma1[0].a1);           /* { dg-warning "\\\[-Wrestrict]" } */
      34    T (ma1[1].a1, ma1[0].a1);
      35    T (ma1[2].a1, ma1[0].a1);
      36    T (ma1[3].a1, ma1[0].a1);
      37  }
      38  
      39  
      40  void test_ma1_var_cst (const char *s, int i)
      41  {
      42    T (ma1[i].a1, ma1[0].a1);
      43    T (ma1[i].a1, ma1[1].a1);
      44    T (ma1[i].a1, ma1[2].a1);
      45    T (ma1[i].a1, ma1[3].a1);
      46  
      47    T (ma1[0].a1, ma1[i].a1);
      48    T (ma1[1].a1, ma1[i].a1);
      49    T (ma1[2].a1, ma1[i].a1);
      50    T (ma1[3].a1, ma1[i].a1);
      51  }
      52  
      53  
      54  void test_ma1_var_var (const char *s, int i, int j)
      55  {
      56    T (ma1[i].a1, ma1[j].a1);
      57    T (ma1[i].a1, ma1[j].a1);
      58    T (ma1[i].a1, ma1[j].a1);
      59    T (ma1[i].a1, ma1[j].a1);
      60  
      61    T (ma1[i].a1, ma1[j].a1);
      62    T (ma1[i].a1, ma1[j].a1);
      63    T (ma1[i].a1, ma1[j].a1);
      64    T (ma1[i].a1, ma1[j].a1);
      65  }
      66  
      67  
      68  void test_ma2_cst (const char *s)
      69  {
      70    T (ma2[0][0].a1, ma2[0][0].a1);     /* { dg-warning "\\\[-Wrestrict]" } */
      71    T (ma2[0][0].a1, ma2[0][1].a1);
      72    T (ma2[0][0].a1, ma2[0][2].a1);
      73    T (ma2[0][0].a1, ma2[0][3].a1);
      74  
      75    T (ma2[0][0].a1, ma2[1][0].a1);
      76    T (ma2[0][0].a1, ma2[1][1].a1);
      77    T (ma2[0][0].a1, ma2[1][2].a1);
      78    T (ma2[0][0].a1, ma2[1][3].a1);
      79  
      80    T (ma2[0][0].a1, ma2[2][0].a1);
      81    T (ma2[0][0].a1, ma2[2][1].a1);
      82    T (ma2[0][0].a1, ma2[2][2].a1);
      83    T (ma2[0][0].a1, ma2[2][3].a1);
      84  
      85    T (ma2[0][0].a1, ma2[3][0].a1);
      86    T (ma2[0][0].a1, ma2[3][1].a1);
      87    T (ma2[0][0].a1, ma2[3][2].a1);
      88    T (ma2[0][0].a1, ma2[3][3].a1);
      89  
      90  
      91    T (ma2[0][1].a1, ma2[0][0].a1);
      92    T (ma2[0][1].a1, ma2[0][1].a1);     /* { dg-warning "\\\[-Wrestrict]" } */
      93    T (ma2[0][1].a1, ma2[0][2].a1);
      94    T (ma2[0][1].a1, ma2[0][3].a1);
      95  
      96    T (ma2[0][1].a1, ma2[1][0].a1);
      97    T (ma2[0][1].a1, ma2[1][1].a1);
      98    T (ma2[0][1].a1, ma2[1][2].a1);
      99    T (ma2[0][1].a1, ma2[1][3].a1);
     100  
     101    T (ma2[0][1].a1, ma2[2][0].a1);
     102    T (ma2[0][1].a1, ma2[2][1].a1);
     103    T (ma2[0][1].a1, ma2[2][2].a1);
     104    T (ma2[0][1].a1, ma2[2][3].a1);
     105  
     106    T (ma2[0][1].a1, ma2[3][0].a1);
     107    T (ma2[0][1].a1, ma2[3][1].a1);
     108    T (ma2[0][1].a1, ma2[3][2].a1);
     109    T (ma2[0][1].a1, ma2[3][3].a1);
     110  
     111  
     112    T (ma2[0][2].a1, ma2[0][0].a1);
     113    T (ma2[0][2].a1, ma2[0][1].a1);
     114    T (ma2[0][2].a1, ma2[0][2].a1);     /* { dg-warning "\\\[-Wrestrict]" } */
     115    T (ma2[0][2].a1, ma2[0][3].a1);
     116  
     117    T (ma2[0][2].a1, ma2[1][0].a1);
     118    T (ma2[0][2].a1, ma2[1][1].a1);
     119    T (ma2[0][2].a1, ma2[1][2].a1);
     120    T (ma2[0][2].a1, ma2[1][3].a1);
     121  
     122    T (ma2[0][2].a1, ma2[2][0].a1);
     123    T (ma2[0][2].a1, ma2[2][1].a1);
     124    T (ma2[0][2].a1, ma2[2][2].a1);
     125    T (ma2[0][2].a1, ma2[2][3].a1);
     126  
     127    T (ma2[0][2].a1, ma2[3][0].a1);
     128    T (ma2[0][2].a1, ma2[3][1].a1);
     129    T (ma2[0][2].a1, ma2[3][2].a1);
     130    T (ma2[0][2].a1, ma2[3][3].a1);
     131  
     132  
     133    T (ma2[0][3].a1, ma2[0][0].a1);
     134    T (ma2[0][3].a1, ma2[0][1].a1);
     135    T (ma2[0][3].a1, ma2[0][2].a1);
     136    T (ma2[0][3].a1, ma2[0][3].a1);     /* { dg-warning "\\\[-Wrestrict]" } */
     137  
     138    T (ma2[0][3].a1, ma2[1][0].a1);
     139    T (ma2[0][3].a1, ma2[1][1].a1);
     140    T (ma2[0][3].a1, ma2[1][2].a1);
     141    T (ma2[0][3].a1, ma2[1][3].a1);
     142  
     143    T (ma2[0][3].a1, ma2[2][0].a1);
     144    T (ma2[0][3].a1, ma2[2][1].a1);
     145    T (ma2[0][3].a1, ma2[2][2].a1);
     146    T (ma2[0][3].a1, ma2[2][3].a1);
     147  
     148    T (ma2[0][3].a1, ma2[3][0].a1);
     149    T (ma2[0][3].a1, ma2[3][1].a1);
     150    T (ma2[0][3].a1, ma2[3][2].a1);
     151    T (ma2[0][3].a1, ma2[3][3].a1);
     152  }
     153  
     154  
     155  void test_ma2_var (int i0, int j0, int i1, int j1)
     156  {
     157    T (ma2[i0][j0].a1, ma2[i0][j0].a1);       /* { dg-warning "\\\[-Wrestrict]" } */
     158  
     159    T (ma2[i0][j0].a1, ma2[i0][j1].a1);       /* { dg-bogus "\\\[-Wrestrict]" } */
     160    T (ma2[i0][j0].a1, ma2[i1][j1].a1);       /* { dg-bogus "\\\[-Wrestrict]" } */
     161  
     162    T (ma2[0][0].a2[i0], ma2[0][0].a2[j0]);   /* { dg-bogus "\\\[-Wrestrict]" } */
     163    T (ma2[0][i0].a2[0], ma2[0][i1].a2[0]);   /* { dg-bogus "\\\[-Wrestrict]" } */
     164    T (ma2[i0][0].a2[0], ma2[i1][0].a2[0]);   /* { dg-bogus "\\\[-Wrestrict]" } */
     165    T (ma2[i0][j0].a2[0], ma2[i1][j1].a2[0]); /* { dg-bogus "\\\[-Wrestrict]" } */
     166  }
     167  
     168  
     169  void test_p2_var (struct MemArrays **p2, int i0, int j0, int i1, int j1)
     170  {
     171    T (p2[i0][j0].a1, p2[i0][j0].a1);         /* { dg-warning "\\\[-Wrestrict]" } */
     172  
     173    T (p2[i0][j0].a1, p2[i0][j1].a1);
     174    T (p2[i0][j0].a1, p2[i1][j1].a1);
     175  
     176    T (p2[0][0].a2[i0], p2[0][0].a2[j0]);
     177    T (p2[0][i0].a2[0], p2[0][i1].a2[0]);
     178    T (p2[i0][0].a2[0], p2[i1][0].a2[0]);
     179    T (p2[i0][j0].a2[0], p2[i1][j1].a2[0]);
     180  }
     181  
     182  
     183  void test_ma3_cst (const char *s)
     184  {
     185    T (ma3[0][0][0].a1, ma3[0][0][0].a1); /* { dg-warning "\\\[-Wrestrict]" } */
     186    T (ma3[0][0][0].a1, ma3[0][0][3].a1);
     187  
     188    T (ma3[0][0][0].a1, ma3[0][1][0].a1);
     189    T (ma3[0][0][0].a1, ma3[0][1][3].a1);
     190    T (ma3[0][0][0].a1, ma3[1][0][0].a1);
     191    T (ma3[0][0][0].a1, ma3[1][0][3].a1);
     192    T (ma3[0][0][0].a1, ma3[3][0][3].a1);
     193    T (ma3[0][0][0].a1, ma3[3][3][3].a1);
     194  }
     195  
     196  
     197  void test_ma3_var (const char *s,
     198  		   int i0, int j0, int k0,
     199  		   int i1, int j1, int k1)
     200  {
     201    T (ma3[i0][j0][k0].a1, ma3[i0][j0][k0].a1);   /* { dg-warning "\\\[-Wrestrict]" } */
     202  
     203    T (ma3[i0][j0][k0].a1, ma3[i0][j0][k1].a1);   /* { dg-bogus "\\\[-Wrestrict]" } */
     204    T (ma3[i0][j0][k0].a1, ma3[i0][j1][k1].a1);   /* { dg-bogus "\\\[-Wrestrict]" } */
     205    T (ma3[i0][j0][k0].a1, ma3[i1][j1][k1].a1);   /* { dg-bogus "\\\[-Wrestrict]" } */
     206  }