(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
Wrestrict-14.c
       1  /* PR tree-optimization/83456 - -Wrestrict false positive on a non-overlapping
       2     memcpy in an inline function
       3     Verify that calls to built-in functions are diagnosed when the pointer
       4     arguments to their restrict-qualified parameters are the same (the absence
       5     of the false positives reported in PR 83456 is tested in Wrestrict-12.c.
       6     { dg-do compile }
       7     { dg-options "-O2 -Wall -Wrestrict -Wno-stringop-truncation" }  */
       8  
       9  typedef __SIZE_TYPE__ size_t;
      10  
      11  extern void* memcpy (void* restrict, const void* restrict, size_t);
      12  extern void* mempcpy (void* restrict, const void* restrict, size_t);
      13  extern char* stpncpy (char* restrict, const char* restrict, size_t);
      14  extern char* stpcpy (char* restrict, const char* restrict);
      15  extern char* strncat (char* restrict, const char* restrict, size_t);
      16  extern char* strcat (char* restrict, const char* restrict);
      17  extern char* strncpy (char* restrict, const char* restrict, size_t);
      18  extern char* strcpy (char* restrict, const char* restrict);
      19  
      20  struct S
      21  {
      22    char a[4];
      23    char *p;
      24  } s;
      25  
      26  void sink (void*);
      27  
      28  void test_memcpy (char *p, struct S *q, size_t n)
      29  {
      30    /* The behavior of memcpy() is undefined only when when copying takes
      31       place between overlapping objects.  Since a call with a size of zero
      32       does nothing, it should not be diagnosed.  */
      33    memcpy (p, p, 0);
      34    sink (p);
      35  
      36    memcpy (p, p, 1);               /* { dg-warning "\\\[-Wrestrict]" } */
      37    sink (p);
      38  
      39    memcpy (p, p, n);               /* { dg-warning "\\\[-Wrestrict]" } */
      40    sink (p);
      41  
      42    memcpy (q->a, q->a, 0);
      43    sink (q);
      44  
      45    memcpy (q->p, q->p, 1);         /* { dg-warning "\\\[-Wrestrict]" } */
      46    sink (q);
      47  
      48    memcpy (&q->a[0], q->a, n);     /* { dg-warning "\\\[-Wrestrict]" "bug ????" { xfail *-*-* } } */
      49    sink (q);
      50  
      51    memcpy (q, q->a, n);            /* { dg-warning "\\\[-Wrestrict]" "bug ????" { xfail *-*-* } } */
      52    sink (q);
      53  }
      54  
      55  void test_mempcpy (char *p, struct S *q, size_t n)
      56  {
      57    mempcpy (p, p, 0);
      58    sink (p);
      59  
      60    mempcpy (p, p, 1);              /* { dg-warning "\\\[-Wrestrict]" } */
      61    sink (p);
      62  
      63    mempcpy (p, p, n);              /* { dg-warning "\\\[-Wrestrict]" } */
      64    sink (p);
      65  
      66    mempcpy (q->a, q->a, 0);
      67    sink (q);
      68  
      69    mempcpy (q->p, q->p, 1);        /* { dg-warning "\\\[-Wrestrict]" } */
      70    sink (q);
      71  
      72    mempcpy (&q->a[0], q->a, n);    /* { dg-warning "\\\[-Wrestrict]" "bug ????" { xfail *-*-* } } */
      73    sink (q);
      74  
      75    mempcpy (q, q->a, n);           /* { dg-warning "\\\[-Wrestrict]" "bug ????" { xfail *-*-* } } */
      76    sink (q);
      77  }
      78  
      79  void test_strncat (char *p, struct S *q, size_t n)
      80  {
      81    strncat (p, p, 0);
      82    sink (p);
      83  
      84    strncat (p, p, 1);              /* { dg-warning "\\\[-Wrestrict]" } */
      85    sink (p);
      86  
      87    strncat (p, p, n);              /* { dg-warning "\\\[-Wrestrict]" } */
      88    sink (p);
      89  
      90    strncat (q->a, q->a, n);        /* { dg-warning "\\\[-Wrestrict]" } */
      91    sink (q);
      92  
      93    strncat (&q->a[0], &q->a[0], n);/* { dg-warning "\\\[-Wrestrict]" } */
      94    sink (q);
      95  
      96    strncat (q->a, &q->a[0], n);    /* { dg-warning "\\\[-Wrestrict]" } */
      97    sink (q);
      98  
      99    strncat (q->p, &q->p[0], n);    /* { dg-warning "\\\[-Wrestrict]" } */
     100    sink (q);
     101  }
     102  
     103  void test_strcat (char *p, struct S *q, size_t n)
     104  {
     105    strcat (p, p);                  /* { dg-warning "\\\[-Wrestrict]" } */
     106    sink (p);
     107  
     108    strcat (p, p);                  /* { dg-warning "\\\[-Wrestrict]" } */
     109    sink (p);
     110  
     111    strcat (p, p);                  /* { dg-warning "\\\[-Wrestrict]" } */
     112    sink (p);
     113  
     114    strcat (q->a, q->a);            /* { dg-warning "\\\[-Wrestrict]" } */
     115    sink (q);
     116  
     117    strcat (&q->a[0], &q->a[0]);    /* { dg-warning "\\\[-Wrestrict]" } */
     118    sink (q);
     119  
     120    strcat (q->a, &q->a[0]);        /* { dg-warning "\\\[-Wrestrict]" } */
     121    sink (q);
     122  
     123    strcat (q->p, &q->p[0]);        /* { dg-warning "\\\[-Wrestrict]" } */
     124    sink (q);
     125  }
     126  
     127  void test_stpncpy (char *p, struct S *q, size_t n)
     128  {
     129    stpncpy (p, p, 0);              /* { dg-warning "\\\[-Wrestrict]" } */
     130    sink (p);
     131  
     132    stpncpy (p, p, 1);              /* { dg-warning "\\\[-Wrestrict]" } */
     133    sink (p);
     134  
     135    stpncpy (p, p, n);              /* { dg-warning "\\\[-Wrestrict]" } */
     136    sink (p);
     137  
     138    stpncpy (q->a, q->a, n);        /* { dg-warning "\\\[-Wrestrict]" } */
     139    sink (q);
     140  
     141    stpncpy (&q->a[0], &q->a[0], n);/* { dg-warning "\\\[-Wrestrict]" } */
     142    sink (q);
     143  
     144    stpncpy (q->a, &q->a[0], n);    /* { dg-warning "\\\[-Wrestrict]" } */
     145    sink (q);
     146  
     147    stpncpy (q->p, &q->p[0], n);    /* { dg-warning "\\\[-Wrestrict]" } */
     148    sink (q);
     149  }
     150  
     151  void test_stpcpy (char *p, struct S *q, size_t n)
     152  {
     153    stpcpy (p, p);                  /* { dg-warning "\\\[-Wrestrict]" } */
     154    sink (p);
     155  
     156    stpcpy (p, p);                  /* { dg-warning "\\\[-Wrestrict]" } */
     157    sink (p);
     158  
     159    stpcpy (p, p);                  /* { dg-warning "\\\[-Wrestrict]" } */
     160    sink (p);
     161  
     162    stpcpy (q->a, q->a);            /* { dg-warning "\\\[-Wrestrict]" } */
     163    sink (q);
     164  
     165    stpcpy (&q->a[0], &q->a[0]);    /* { dg-warning "\\\[-Wrestrict]" } */
     166    sink (q);
     167  
     168    stpcpy (q->a, &q->a[0]);        /* { dg-warning "\\\[-Wrestrict]" } */
     169    sink (q);
     170  
     171    stpcpy (q->p, &q->p[0]);        /* { dg-warning "\\\[-Wrestrict]" } */
     172    sink (q);
     173  }
     174  
     175  void test_strncpy (char *p, struct S *q, size_t n)
     176  {
     177    strncpy (p, p, 0);
     178    sink (p);
     179  
     180    strncpy (p, p, 1);              /* { dg-warning "\\\[-Wrestrict]" } */
     181    sink (p);
     182  
     183    strncpy (p, p, n);              /* { dg-warning "\\\[-Wrestrict]" } */
     184    sink (p);
     185  
     186    strncpy (q->a, q->a, n);        /* { dg-warning "\\\[-Wrestrict]" } */
     187    sink (q);
     188  
     189    strncpy (&q->a[0], &q->a[0], n);/* { dg-warning "\\\[-Wrestrict]" } */
     190    sink (q);
     191  
     192    strncpy (q->a, &q->a[0], n);    /* { dg-warning "\\\[-Wrestrict]" } */
     193    sink (q);
     194  
     195    strncpy (q->p, &q->p[0], n);    /* { dg-warning "\\\[-Wrestrict]" } */
     196    sink (q);
     197  }
     198  
     199  void test_strcpy (char *p, struct S *q, size_t n)
     200  {
     201    strcpy (p, p);                  /* { dg-warning "\\\[-Wrestrict]" } */
     202    sink (p);
     203  
     204    strcpy (p, p);                  /* { dg-warning "\\\[-Wrestrict]" } */
     205    sink (p);
     206  
     207    strcpy (p, p);                  /* { dg-warning "\\\[-Wrestrict]" } */
     208    sink (p);
     209  
     210    strcpy (q->a, q->a);            /* { dg-warning "\\\[-Wrestrict]" } */
     211    sink (q);
     212  
     213    strcpy (&q->a[0], &q->a[0]);    /* { dg-warning "\\\[-Wrestrict]" } */
     214    sink (q);
     215  
     216    strcpy (q->a, &q->a[0]);        /* { dg-warning "\\\[-Wrestrict]" } */
     217    sink (q);
     218  
     219    strcpy (q->p, &q->p[0]);        /* { dg-warning "\\\[-Wrestrict]" } */
     220    sink (q);
     221  }