Require target lra in gcc.dg/pr108095.c
[official-gcc.git] / gcc / testsuite / gcc.dg / Wstringop-overflow-57.c
blob6ae8589070f098dcfaa00ba3bfefd8b8bacb8759
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 } */
7 typedef __typeof__ (sizeof 0) size_t;
9 int f (void*, size_t);
10 int g (void*);
12 // Test case distilled from gcc/cp/semantics.c
14 int omp_reduction_id (int i, int j, const char *mm)
16 const char *p = 0;
17 const char *m = 0;
19 switch (i)
21 case 1:
22 p = "min";
23 break;
24 case 2:
25 p = "max";
26 break;
27 default:
28 break;
31 if (j)
32 m = mm;
34 const char prefix[] = "omp declare reduction ";
35 size_t lenp = sizeof (prefix);
37 if (__builtin_strncmp (p, prefix, lenp - 1) == 0)
38 lenp = 1;
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));
44 if (lenp > 1)
45 __builtin_memcpy (name, prefix, lenp - 1);
47 __builtin_memcpy (name + lenp - 1, p, len + 1);
48 if (m)
50 name[lenp + len - 1] = '~';
51 __builtin_memcpy (name + lenp + len, m, lenm);
53 return (__builtin_constant_p (name)
54 ? f (name, __builtin_strlen (name)) : g (name));
57 // Test case derived from gcc/d/dmd/root/filename.c.
59 const char *ext (const char *str)
61 size_t len = __builtin_strlen(str);
63 const char *e = str + len;
64 for (;;)
66 switch (*e)
68 case '.': return e + 1;
69 case '/': break;
70 default:
71 if (e == str)
72 break;
73 e--;
74 continue;
76 return 0;
80 const char *removeExt (const char *str)
82 const char *e = ext (str);
83 if (e)
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;
91 return 0;