]>
Commit | Line | Data |
---|---|---|
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 | ||
6 | typedef __typeof__ (sizeof 0) size_t; | |
7 | ||
8 | int f (void*, size_t); | |
9 | int g (void*); | |
10 | ||
11 | // Test case distilled from gcc/cp/semantics.c | |
12 | ||
13 | int 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 | ||
58 | const 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 | ||
79 | const 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 | } |