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