(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
Wstringop-overflow-57.c
       1  /* Verify that an anti-range ~[A, B] with small positive A and B
       2     is handled correctly and doesn't trigger warnings.
       3     { dg-do compile }
       4     { dg-options "-O2 -Wall" }
       5     { dg-require-effective-target alloca } */
       6  
       7  typedef __typeof__ (sizeof 0) size_t;
       8  
       9  int f (void*, size_t);
      10  int g (void*);
      11  
      12  // Test case distilled from gcc/cp/semantics.c
      13  
      14  int omp_reduction_id (int i, int j, const char *mm)
      15  {
      16    const char *p = 0;
      17    const char *m = 0;
      18  
      19    switch (i)
      20      {
      21      case 1:
      22        p = "min";
      23        break;
      24      case 2:
      25        p = "max";
      26        break;
      27      default:
      28        break;
      29      }
      30  
      31    if (j)
      32      m = mm;
      33  
      34    const char prefix[] = "omp declare reduction ";
      35    size_t lenp = sizeof (prefix);
      36  
      37    if (__builtin_strncmp (p, prefix, lenp - 1) == 0)
      38      lenp = 1;
      39  
      40    size_t len = __builtin_strlen (p);
      41    size_t lenm = m ? __builtin_strlen (m) + 1 : 0;
      42    char *name = ((char *) __builtin_alloca(lenp + len + lenm));
      43  
      44    if (lenp > 1)
      45      __builtin_memcpy (name, prefix, lenp - 1);
      46  
      47    __builtin_memcpy (name + lenp - 1, p, len + 1);
      48    if (m)
      49      {
      50        name[lenp + len - 1] = '~';
      51        __builtin_memcpy (name + lenp + len, m, lenm);
      52      }
      53    return (__builtin_constant_p (name)
      54  	  ? f (name, __builtin_strlen (name)) : g (name));
      55  }
      56  
      57  // Test case derived from gcc/d/dmd/root/filename.c.
      58  
      59  const char *ext (const char *str)
      60  {
      61    size_t len = __builtin_strlen(str);
      62  
      63    const char *e = str + len;
      64    for (;;)
      65      {
      66        switch (*e)
      67          {
      68  	case '.': return e + 1;
      69  	case '/': break;
      70  	default:
      71  	  if (e == str)
      72  	    break;
      73  	  e--;
      74  	  continue;
      75          }
      76        return 0;
      77      }
      78  }
      79  
      80  const char *removeExt (const char *str)
      81  {
      82    const char *e = ext (str);
      83    if (e)
      84      {
      85        size_t len = (e - str) - 1;
      86        char *n = (char *)__builtin_malloc (len + 1);
      87        __builtin_memcpy(n, str, len);
      88        n[len] = 0;
      89        return n;
      90      }
      91    return 0;
      92  }