(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
Wrestrict-16.c
       1  /* PR tree-optimization/85753 - missing -Wrestrict on memcpy into a member
       2     array
       3     { dg-do compile }
       4     { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
       5  
       6  #define memcpy   __builtin_memcpy
       7  
       8  char a[16];
       9  
      10  struct { char a[16]; } x;
      11  
      12  /* Exercise aggregate types.  */
      13  
      14  void test_aggr_idx_nowarn (int i, int j)
      15  {
      16    memcpy (&a[i], &a[j], 7);
      17    memcpy (&x.a[i], &x.a[j], 7);
      18  }
      19  
      20  void test_aggr_idx_warn (int i, int j)
      21  {
      22    memcpy (&a[i], &a[j], 9);       /* { dg-warning "\\\[-Wrestrict" } */
      23    memcpy (&x.a[i], &x.a[j], 9);   /* { dg-warning "\\\[-Wrestrict" } */
      24  }
      25  
      26  void test_aggr_off_nowarn (int i, int j)
      27  {
      28    memcpy (a + i, a + j, 5);
      29    memcpy (x.a + i, x.a + j, 5);
      30  }
      31  
      32  void test_aggr_off_warn (int i, int j)
      33  {
      34    memcpy (a + i, a + j, 9);       /* { dg-warning "\\\[-Wrestrict" } */
      35    memcpy (x.a + i, x.a + j, 9);   /* { dg-warning "\\\[-Wrestrict" } */
      36  }
      37  
      38  
      39  void sink (void*);
      40  
      41  #define T(call) sink (call)
      42  
      43  
      44  /* Also exercise basic types.  */
      45  
      46  #ifdef __UINT32_TYPE__
      47  
      48  __UINT32_TYPE__ i32;
      49  
      50  void test_basic_32 (int i, int j)
      51  {
      52    char *p = (char*)&i32;
      53  
      54    T (memcpy (&p[i], &p[j], 1));
      55    T (memcpy (&p[i], &p[j], 2));
      56    T (memcpy (&p[i], &p[j], 3));   /* { dg-warning "\\\[-Wrestrict" } */
      57  
      58    T (memcpy (p + i, p + j, 1));
      59    T (memcpy (p + i, p + j, 2));
      60    T (memcpy (p + i, p + j, 3));   /* { dg-warning "\\\[-Wrestrict" } */
      61  }
      62  
      63  #endif
      64  
      65  #ifdef __UINT64_TYPE__
      66  
      67  __UINT64_TYPE__ i64;
      68  
      69  void test_basic_64 (int i, int j)
      70  {
      71    char *p = (char*)&i64;
      72  
      73    T (memcpy (&p[i], &p[j], 1));
      74    T (memcpy (&p[i], &p[j], 2));
      75    T (memcpy (&p[i], &p[j], 3));
      76    T (memcpy (&p[i], &p[j], 5));   /* { dg-warning "\\\[-Wrestrict" } */
      77    T (memcpy (&p[i], &p[j], 6));   /* { dg-warning "\\\[-Wrestrict" } */
      78    T (memcpy (&p[i], &p[j], 7));   /* { dg-warning "\\\[-Wrestrict" } */
      79  
      80    T (memcpy (p + i, p + j, 1));
      81    T (memcpy (p + i, p + j, 2));
      82    T (memcpy (p + i, p + j, 3));
      83    T (memcpy (p + i, p + j, 5));   /* { dg-warning "\\\[-Wrestrict" } */
      84    T (memcpy (p + i, p + j, 6));   /* { dg-warning "\\\[-Wrestrict" } */
      85    T (memcpy (p + i, p + j, 7));   /* { dg-warning "\\\[-Wrestrict" } */
      86  }
      87  
      88  #endif