annotate gcc/testsuite/gcc.dg/addr_builtin-1.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* PR66516 - missing diagnostic on taking the address of a builtin function
kono
parents:
diff changeset
2 { dg-do compile } */
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 typedef void (F)(void);
kono
parents:
diff changeset
5 typedef __UINTPTR_TYPE__ uintptr_t;
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 /* Utility function to test passing built-in functions as an ordinary
kono
parents:
diff changeset
8 argument and via the ellipsis. */
kono
parents:
diff changeset
9 static void func_arg (F *p, ...) { (void)p; }
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 static F* test_taking_address_of_gcc_builtin (void)
kono
parents:
diff changeset
12 {
kono
parents:
diff changeset
13 F *p;
kono
parents:
diff changeset
14 void *q;
kono
parents:
diff changeset
15 uintptr_t a;
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 /* Call, cast to void, and id are allowed. */
kono
parents:
diff changeset
18 __builtin_trap ();
kono
parents:
diff changeset
19 (void)__builtin_trap;
kono
parents:
diff changeset
20 __builtin_trap;
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 {
kono
parents:
diff changeset
23 typedef __typeof__ (__builtin_trap) F; /* Okay. */
kono
parents:
diff changeset
24 }
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 /* Address and indirection operators. */
kono
parents:
diff changeset
27 p = &__builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
28 p = *__builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 /* Unary NOT. */
kono
parents:
diff changeset
31 a = !__builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 /* Sizeof and _Alignof are disallowed by C but allowed by GCC
kono
parents:
diff changeset
34 and there's no reason to reject built-ins as operands since
kono
parents:
diff changeset
35 doing so doesn't yield their address. */
kono
parents:
diff changeset
36 #pragma GCC diagnostic push
kono
parents:
diff changeset
37 /* Disable: invalid application of 'sizeof' to a function type. */
kono
parents:
diff changeset
38 #pragma GCC diagnostic ignored "-Wpointer-arith"
kono
parents:
diff changeset
39 a = sizeof __builtin_trap;
kono
parents:
diff changeset
40 #pragma GCC diagnostic pop
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 #ifndef __STDC_VERSION__
kono
parents:
diff changeset
43 # pragma GCC diagnostic push
kono
parents:
diff changeset
44 /* Disable: ISO C90 does not support '_Alignof'. */
kono
parents:
diff changeset
45 # pragma GCC diagnostic ignored "-Wpedantic"
kono
parents:
diff changeset
46 #endif
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 a = _Alignof __builtin_trap;
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 #ifndef __STDC_VERSION__
kono
parents:
diff changeset
51 # pragma GCC diagnostic pop
kono
parents:
diff changeset
52 #endif
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 /* Casts. */
kono
parents:
diff changeset
55 p = (F*)__builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
56 a = (uintptr_t)__builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 /* Additive operator. */
kono
parents:
diff changeset
59 p = __builtin_trap + 0; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
60 p = __builtin_trap - 0; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
61 a = __builtin_trap - p; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
62 a = p - __builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 /* Relational operators. */
kono
parents:
diff changeset
65 a = __builtin_trap < p; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
66 a = p < __builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 a = __builtin_trap <= p; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
69 a = p <= __builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 a = __builtin_trap > p; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
72 a = p > __builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 a = __builtin_trap > p; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
75 a = p > __builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 a = __builtin_trap <= p; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
78 a = p <= __builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 a = __builtin_trap <= p; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
81 a = p <= __builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 /* Equality operators. */
kono
parents:
diff changeset
84 a = __builtin_trap == p; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
85 a = p == __builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
86 a = __builtin_trap != p; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
87 a = p != __builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 /* Logical AND and OR. */
kono
parents:
diff changeset
90 a = __builtin_trap && p; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
91 a = p && __builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 a = __builtin_trap || p; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
94 a = p || __builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 /* Conditional operator. */
kono
parents:
diff changeset
97 a = __builtin_trap ? 1 : 0; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
98 p = a ? __builtin_trap : 0; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
99 p = a ? 0 : __builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 /* Assignment operator. */
kono
parents:
diff changeset
102 p = __builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 q = __builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
105 a = __builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 /* Passing as an argument. */
kono
parents:
diff changeset
108 func_arg (__builtin_trap); /* { dg-error "built-in function" } */
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 /* Passing through the ellipsis. */
kono
parents:
diff changeset
111 func_arg (0, __builtin_trap); /* { dg-error "built-in function" } */
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 /* Return statement. */
kono
parents:
diff changeset
114 return __builtin_trap; /* { dg-error "built-in function" } */
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 (void)a;
kono
parents:
diff changeset
117 (void)p;
kono
parents:
diff changeset
118 (void)q;
kono
parents:
diff changeset
119 }
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 /* Helper declarations to verify that it's possible to take the address
kono
parents:
diff changeset
122 of a user-declared function that's also a GCC built-in. */
kono
parents:
diff changeset
123 extern int abs (int);
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 extern __SIZE_TYPE__ strlen (const char*);
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 /* Taking the address of a builtin with a library "fallback" must be
kono
parents:
diff changeset
128 allowed, either using the __builtin_xxx form or the xxx form, when
kono
parents:
diff changeset
129 the library fallback is declared either explicitly or implicitly
kono
parents:
diff changeset
130 by virtue of first calling the function. */
kono
parents:
diff changeset
131 void test_taking_address_of_library_builtin (int i)
kono
parents:
diff changeset
132 {
kono
parents:
diff changeset
133 {
kono
parents:
diff changeset
134 typedef int F (int);
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 /* Compute the address of libc's abs using the implicitly declared
kono
parents:
diff changeset
137 __builtin_abs form (all expressions are valid). */
kono
parents:
diff changeset
138 F *p = __builtin_abs;
kono
parents:
diff changeset
139 p = &__builtin_abs;
kono
parents:
diff changeset
140 p = *__builtin_abs;
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 /* Compute the address of libc's abs declared above. */
kono
parents:
diff changeset
143 p = abs;
kono
parents:
diff changeset
144 p = &abs;
kono
parents:
diff changeset
145 p = *abs;
kono
parents:
diff changeset
146 (void)p;
kono
parents:
diff changeset
147 }
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 {
kono
parents:
diff changeset
150 typedef __SIZE_TYPE__ size_t;
kono
parents:
diff changeset
151 typedef size_t F (const char*);
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 /* Compute the address of libc's strlen using the implicitly
kono
parents:
diff changeset
154 declared __builtin_strlen form. */
kono
parents:
diff changeset
155 F *p = __builtin_strlen;
kono
parents:
diff changeset
156 p = &__builtin_strlen;
kono
parents:
diff changeset
157 p = *__builtin_strlen;
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 /* Compute the address of libc's strlen declared above. */
kono
parents:
diff changeset
160 p = strlen;
kono
parents:
diff changeset
161 p = &strlen;
kono
parents:
diff changeset
162 p = *strlen;
kono
parents:
diff changeset
163 (void)p;
kono
parents:
diff changeset
164 }
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 {
kono
parents:
diff changeset
167 typedef int F (int);
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 /* Compute the address of libc's isxxx functions using the implicitly
kono
parents:
diff changeset
170 declared __builtin_xxx form. */
kono
parents:
diff changeset
171 F *p = __builtin_isalnum;
kono
parents:
diff changeset
172 p = &__builtin_isalpha;
kono
parents:
diff changeset
173 p = *__builtin_iscntrl;
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 /* According to C90 (see also the discussion in c/67386):
kono
parents:
diff changeset
176 If the expression that precedes the parenthesized argument list
kono
parents:
diff changeset
177 in a function call consists solely of an identifier, and if no
kono
parents:
diff changeset
178 declaration is visible for this identifier, the identifier is
kono
parents:
diff changeset
179 implicitly declared exactly as if, in the innermost block
kono
parents:
diff changeset
180 containing the function call, the declaration
kono
parents:
diff changeset
181 extern int identifier();
kono
parents:
diff changeset
182 appeared. */
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 /* Call the functions first to have their declarations "injected"
kono
parents:
diff changeset
185 into the enclosing block. Suppress warnings. */
kono
parents:
diff changeset
186 #pragma GCC diagnostic push
kono
parents:
diff changeset
187 #pragma GCC diagnostic ignored "-Wimplicit-function-declaration"
kono
parents:
diff changeset
188 i = isalnum (i) || isalpha (i) || iscntrl (i);
kono
parents:
diff changeset
189 #pragma GCC diagnostic pop
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 /* Take the address of the functions relying on their declarations
kono
parents:
diff changeset
192 having been implicitly provided by the calls above. */
kono
parents:
diff changeset
193 p = isalnum;
kono
parents:
diff changeset
194 p = &isalpha;
kono
parents:
diff changeset
195 p = *iscntrl;
kono
parents:
diff changeset
196 (void)p;
kono
parents:
diff changeset
197 }
kono
parents:
diff changeset
198 }