1 /* Verify __builtin_has_attribute return value for variables.
2    { dg-do compile }
3    { dg-skip-if "No section attribute" { { hppa*-*-hpux* } && { ! lp64 } } }
4    { dg-options "-Wall -ftrack-macro-expansion=0" }
foo(v8si * x,v4di * y,int z)5    { dg-options "-Wall -Wno-narrowing -Wno-unused -ftrack-macro-expansion=0" { target c++ } }
6    { dg-additional-options "-DSKIP_ALIAS" { target *-*-darwin* } }
7    { dg-require-visibility "hidden" }
8 */
9 
10 #define ATTR(...) __attribute__ ((__VA_ARGS__))
11 
12 #define A(expect, sym, attr)						\
13   typedef int Assert [1 - 2 * !(__builtin_has_attribute (sym, attr) == expect)]
14 
15 int vnone;
16 
17 ATTR (aligned) char valigned;
18 ATTR (aligned (1)) char valigned_1;
19 ATTR (aligned (2)) char valigned_2;
20 ATTR (aligned (4)) char valigned_4;
21 ATTR (aligned (8)) char valigned_8;
22 
23 void test_aligned (void)
24 {
25   A (0, vnone, aligned);
26   A (0, vnone, aligned (0));      /* { dg-warning "requested alignment .0. is not a positive power of 2" } */
27   A (0, vnone, aligned (1));
28   A (0, vnone, aligned (2));
29   A (0, vnone, aligned (4));
30   A (0, vnone, aligned (8));
31   A (0, vnone, aligned (16));
32 
33   A (1, valigned, aligned);
34   A (0, valigned, aligned (0));   /* { dg-warning "requested alignment .0. is not a positive power of 2" } */
35   A (0, valigned, aligned (1));
36   A (0, valigned, aligned (2));
37 
38   A (1, valigned_1, aligned);
39   A (0, valigned_1, aligned (0)); /* { dg-warning "requested alignment .0. is not a positive power of 2" } */
40   A (1, valigned_1, aligned (1));
41   A (0, valigned_1, aligned (2));
42   A (0, valigned_1, aligned (4));
43 
44   A (1, valigned_2, aligned);
45   A (0, valigned_2, aligned (0)); /* { dg-warning "requested alignment .0. is not a positive power of 2" } */
46   A (0, valigned_2, aligned (1));
47   A (1, valigned_2, aligned (2));
48   A (0, valigned_2, aligned (4));
49 }
50 
51 
52 #ifndef SKIP_ALIAS
53 int vtarget;
54 extern ATTR (alias ("vtarget")) int valias;
55 
56 void test_alias (void)
57 {
58   A (0, vnone, alias);
59   A (1, valias, alias);
60   A (1, valias, alias ("vtarget"));
61   A (0, valias, alias ("vnone"));
62 }
63 #endif
64 
65 void test_cleanup (void)
66 {
67   extern void fpv (void*);
68   extern void fcleanup (void*);
69 
70   int var;
71   ATTR (cleanup (fcleanup)) int var_cleanup;
72   A (0, var, cleanup);
73   A (1, var_cleanup, cleanup);
74   A (1, var_cleanup, cleanup (fcleanup));
75   A (0, var_cleanup, cleanup (fpv));
76 }
77 
78 
79 ATTR (common) int vcommon;
80 ATTR (nocommon) int vnocommon;
81 
82 void test_common (void)
83 {
84   A (0, vnone, common);
85   A (0, vnone, nocommon);
86 
87   A (1, vcommon, common);
88   A (0, vcommon, nocommon);
89 
90   A (0, vnocommon, common);
91   A (1, vnocommon, nocommon);
92 }
93 
94 
95 void test_externally_visible (void)
96 {
97   extern int vexternally_visible;
98 
99   A (0, vexternally_visible, externally_visible);
100 
101   extern ATTR (externally_visible) int vexternally_visible;
102 
103   A (1, vexternally_visible, externally_visible);
104 }
105 
106 
107 int test_mode (void)
108 {
109   ATTR (mode (byte)) int i8;
110   return __builtin_has_attribute (i8, mode);   /* { dg-warning ".mode. attribute not supported in .__builtin_has_attribute." } */
111 }
112 
113 
114 void test_nonstring (void)
115 {
116   char arr[1];
117   char* ptr = arr;
118 
119   ATTR (nonstring) char arr_nonstring[1];
120   ATTR (nonstring) char *ptr_nonstring =  arr_nonstring;
121 
122   A (0, arr, nonstring);
123   A (0, ptr, nonstring);
124 
125   A (1, arr_nonstring, nonstring);
126   A (1, ptr_nonstring, nonstring);
127 }
128 
129 struct PackedMember
130 {
131   char c;
132   short s;
133   int i;
134   ATTR (packed) int a[2]; /* { dg-warning "attribute ignored" "" { target default_packed } } */
135 } gpak[2];
136 
137 void test_packed (struct PackedMember *p)
138 {
139   int vunpacked;
140   ATTR (packed) int vpacked;   /* { dg-warning ".packed. attribute ignored" } */
141 
142   A (0, vunpacked, packed);
143   A (0, vpacked, packed);
144 
145   int arr_unpacked[2];
146   ATTR (packed) int arr_packed[2];   /* { dg-warning ".packed. attribute ignored" } */
147 
148   A (0, arr_unpacked, packed);
149   A (0, arr_packed, packed);
150   A (0, arr_unpacked[0], packed);
151   A (0, arr_packed[0], packed);
152 
153   A (0, gpak, packed);
154   A (0, gpak[0], packed);
155   A (0, *gpak, packed);
156   A (0, gpak[0].c, packed);
157   A (0, gpak[1].s, packed);
158   A (1, gpak->a, packed);
159   /* It's the array that's declared packed but not its elements.  */
160   A (0, (*gpak).a[0], packed);
161 
162   /* The following fails because in C it's represented as
163        INDIRECT_REF (POINTER_PLUS (NOP_EXPR (ADDR_EXPR (gpak)), ...))
164      with no reference to the member.  Avoid testing it.
165   A (1, *gpak[9].a, packed);  */
166 
167   A (0, p->c, packed);
168   A (0, p->s, packed);
169   A (1, p->a, packed);
170   /* It's the array that's declared packed but not its elements.  */
171   A (0, p->a[0], packed);
172   /* Similar to the comment above.
173    A (1, *p->a, packed);  */
174 }
175 
176 
177 ATTR (section ("sectA")) int var_sectA;
178 ATTR (section ("sectB")) int var_sectB;
179 
180 void test_section (void)
181 {
182   int var = 0;
183   A (0, var, section);
184   A (0, var, section ("sectA"));
185 
186   A (1, var_sectA, section);
187   A (1, var_sectA, section ("sectA"));
188   A (0, var_sectA, section ("sectB"));
189 
190   A (1, var_sectB, section);
191   A (0, var_sectB, section ("sectA"));
192   A (1, var_sectB, section ("sectB"));
193 }
194 
195 
196 void test_vector_size (void)
197 {
198   char c;
199   extern int arrx[];
200   extern int arr1[1];
201 
202   A (0, c, vector_size);
203   A (0, c, vector_size (1));
204   A (0, arrx, vector_size);
205   A (0, arrx, vector_size (4));
206   A (0, arr1, vector_size);
207   A (0, arr1, vector_size (8));
208 
209   ATTR (vector_size (4)) char cv4;
210   ATTR (vector_size (16)) int iv16;
211 
212   A (1, cv4, vector_size);
213   A (0, cv4, vector_size (1));
214   A (0, cv4, vector_size (2));
215   A (1, cv4, vector_size (4));
216   A (0, cv4, vector_size (8));
217 
218   A (1, iv16, vector_size);
219   A (0, iv16, vector_size (1));
220   A (0, iv16, vector_size (8));
221   A (1, iv16, vector_size (16));
222   A (0, iv16, vector_size (32));
223 
224   /* Verify that the attribute not detected on an array of vectors
225      but is detected on its elements.  */
226   typedef ATTR (vector_size (8)) float afv8_t[4];
227   A (0, afv8_t, vector_size);
228   A (0, afv8_t, vector_size (1));
229   A (0, afv8_t, vector_size (2));
230   A (0, afv8_t, vector_size (4));
231   A (0, afv8_t, vector_size (8));
232   A (0, afv8_t, vector_size (16));
233 
234   A (1, __typeof__ ((*(afv8_t*)0)[0]), vector_size);
235   A (0, __typeof__ ((*(afv8_t*)0)[1]), vector_size (1));
236   A (0, __typeof__ ((*(afv8_t*)0)[2]), vector_size (2));
237   A (0, __typeof__ ((*(afv8_t*)0)[3]), vector_size (4));
238   A (1, __typeof__ ((*(afv8_t*)0)[0]), vector_size (8));
239   A (0, __typeof__ ((*(afv8_t*)0)[1]), vector_size (16));
240 
241   A (1, __typeof__ (**(afv8_t*)0), vector_size);
242   A (0, __typeof__ (**(afv8_t*)0), vector_size (1));
243   A (0, __typeof__ (**(afv8_t*)0), vector_size (2));
244   A (0, __typeof__ (**(afv8_t*)0), vector_size (4));
245   A (1, __typeof__ (**(afv8_t*)0), vector_size (8));
246   A (0, __typeof__ (**(afv8_t*)0), vector_size (16));
247 
248   ATTR (vector_size (8)) float afv8[4];
249   A (0, afv8, vector_size);
250   A (0, afv8, vector_size (1));
251   A (0, afv8, vector_size (2));
252   A (0, afv8, vector_size (4));
253   A (0, afv8, vector_size (8));
254   A (0, afv8, vector_size (16));
255 
256   A (1, afv8[0], vector_size);
257   A (0, afv8[1], vector_size (1));
258   A (0, afv8[2], vector_size (2));
259   A (0, afv8[3], vector_size (4));
260   A (1, afv8[0], vector_size (8));
261   A (0, afv8[1], vector_size (16));
262 
263   A (1, *afv8, vector_size);
264   A (0, *afv8, vector_size (1));
265   A (0, *afv8, vector_size (2));
266   A (0, *afv8, vector_size (4));
267   A (1, *afv8, vector_size (8));
268   A (0, *afv8, vector_size (16));
269 
270   /* sizeof (long double) is 12 on i386.  */
271   enum { VecSize = 8 * sizeof (long double) };
272   ATTR (vector_size (VecSize)) long double aldv[1][2][3];
273   A (0, aldv, vector_size);
274   A (0, aldv[0], vector_size);
275   A (0, aldv[0][0], vector_size);
276   A (1, aldv[0][0][0], vector_size);
277   A (0, aldv[0][0][1], vector_size (VecSize / 2));
278   A (1, aldv[0][0][2], vector_size (VecSize));
279 
280   A (0, aldv[0][0][0][0], vector_size);
281 
282   A (0, *aldv, vector_size);
283   A (0, **aldv, vector_size);
284   A (1, ***aldv, vector_size);
285   A (1, ***aldv, vector_size (VecSize));
286 }
287 
288 
289 ATTR (visibility ("default")) int vdefault;
290 ATTR (visibility ("hidden")) int vhidden;
291 ATTR (visibility ("internal")) int vinternal;
292 ATTR (visibility ("protected")) int vprotected;
293 
294 void test_visibility (void)
295 {
296   A (0, vnone, visibility ("default"));
297   A (0, vnone, visibility ("hidden"));
298   A (0, vnone, visibility ("internal"));
299   A (0, vnone, visibility ("protected"));
300 
301   A (1, vdefault, visibility ("default"));
302   A (0, vdefault, visibility ("hidden"));
303   A (0, vdefault, visibility ("internal"));
304   A (0, vdefault, visibility ("protected"));
305 
306   A (0, vhidden, visibility ("default"));
307   A (1, vhidden, visibility ("hidden"));
308   A (0, vhidden, visibility ("internal"));
309   A (0, vhidden, visibility ("protected"));
310 
311   A (0, vinternal, visibility ("default"));
312   A (0, vinternal, visibility ("hidden"));
313   A (1, vinternal, visibility ("internal"));
314   A (0, vinternal, visibility ("protected"));
315 
316   A (0, vprotected, visibility ("default"));
317   A (0, vprotected, visibility ("hidden"));
318   A (0, vprotected, visibility ("internal"));
319   A (1, vprotected, visibility ("protected"));
320 }
321 
322 
323 int var_init_strong = 123;
324 int var_uninit_strong;
325 static int var_extern_strong;
326 static int var_static_strong;
327 
328 ATTR (weak) int var_init_weak = 234;
329 ATTR (weak) int var_uninit_weak;
330 
331 void test_weak (void)
332 {
333   int var_local = 0;
334   static int var_static_local = 0;
335 
336   A (0, var_init_strong, weak);
337   A (0, var_uninit_strong, weak);
338   A (0, var_extern_strong, weak);
339   A (0, var_static_strong, weak);
340   A (0, var_local, weak);
341   A (0, var_static_local, weak);
342 
343   A (1, var_init_weak, weak);
344   A (1, var_uninit_weak, weak);
345 } /* { dg-warning "protected visibility attribute not supported" "" { target { *-*-darwin* } } } */
346 
347 /* { dg-prune-output "specifies less restrictive attribute" } */
348