]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/testsuite/gcc.dg/Wstringop-overflow-57.c
Update copyright years.
[thirdparty/gcc.git] / gcc / testsuite / gcc.dg / Wstringop-overflow-57.c
CommitLineData
c0b09c12
MS
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
6typedef __typeof__ (sizeof 0) size_t;
7
8int f (void*, size_t);
9int g (void*);
10
11// Test case distilled from gcc/cp/semantics.c
12
13int omp_reduction_id (int i, int j, const char *mm)
14{
15 const char *p = 0;
16 const char *m = 0;
17
18 switch (i)
19 {
20 case 1:
21 p = "min";
22 break;
23 case 2:
24 p = "max";
25 break;
26 default:
27 break;
28 }
29
30 if (j)
31 m = mm;
32
33 const char prefix[] = "omp declare reduction ";
34 size_t lenp = sizeof (prefix);
35
36 if (__builtin_strncmp (p, prefix, lenp - 1) == 0)
37 lenp = 1;
38
39 size_t len = __builtin_strlen (p);
40 size_t lenm = m ? __builtin_strlen (m) + 1 : 0;
41 char *name = ((char *) __builtin_alloca(lenp + len + lenm));
42
43 if (lenp > 1)
44 __builtin_memcpy (name, prefix, lenp - 1);
45
46 __builtin_memcpy (name + lenp - 1, p, len + 1);
47 if (m)
48 {
49 name[lenp + len - 1] = '~';
50 __builtin_memcpy (name + lenp + len, m, lenm);
51 }
52 return (__builtin_constant_p (name)
53 ? f (name, __builtin_strlen (name)) : g (name));
54}
55
56// Test case derived from gcc/d/dmd/root/filename.c.
57
58const char *ext (const char *str)
59{
60 size_t len = __builtin_strlen(str);
61
62 const char *e = str + len;
63 for (;;)
64 {
65 switch (*e)
66 {
67 case '.': return e + 1;
68 case '/': break;
69 default:
70 if (e == str)
71 break;
72 e--;
73 continue;
74 }
75 return 0;
76 }
77}
78
79const char *removeExt (const char *str)
80{
81 const char *e = ext (str);
82 if (e)
83 {
84 size_t len = (e - str) - 1;
85 char *n = (char *)__builtin_malloc (len + 1);
86 __builtin_memcpy(n, str, len);
87 n[len] = 0;
88 return n;
89 }
90 return 0;
91}