2 { dg-options "-Wall -Wattributes -ftrack-macro-expansion=0" } */
4 #define ATTR(attrlist) __attribute__ (attrlist)
6 /* Exercise the handling of the mutually exclusive attributes
7 aligned and packed on a type definition. */
9 /* Pointless but benign. */
10 struct ATTR ((aligned
, aligned
))
11 AlignedAligned
{ int i
; };
13 /* Aligned followed by packed on a type and vice versa has a valid use:
14 to decrease the alignment of a type to the specified boundary. */
15 struct ATTR ((aligned
, packed
))
16 AlignedPacked
{ int i
; };
18 struct ATTR ((packed
, aligned
))
19 PackedAligned
{ int i
; };
21 struct ATTR ((aligned (2)))
24 int ATTR ((packed
)) i
; // { dg-warning "attribute ignored" "" { target default_packed } }
27 struct ATTR ((packed
))
30 int ATTR ((aligned (2))) i
;
33 /* Silly but benign. */
34 struct ATTR ((packed
, packed
))
35 PackedPacked
{ int i
; };
38 /* Exercise the handling of the mutually exclusive attributes
39 aligned and packed on a function declaration. */
41 void ATTR ((aligned (8), packed
))
42 faligned8_1 (void); /* { dg-warning "ignoring attribute .packed. because it conflicts with attribute .aligned." } */
44 void ATTR ((aligned (8)))
45 faligned8_2 (void); /* { dg-message "previous declaration here" } */
48 faligned8_2 (void); /* { dg-warning "ignoring attribute .packed. because it conflicts with attribute .aligned." } */
50 /* Exercise the handling of the mutually exclusive attributes
51 always_inline and noinline (in that order). */
53 inline void ATTR ((always_inline
))
54 falways_inline1 (void);
56 inline void ATTR ((__always_inline__
))
57 falways_inline1 (void);
59 /* Verify that repeating attribute always_inline on the same declaration
60 doesn't trigger a warning. */
61 inline void ATTR ((always_inline
, __always_inline__
))
62 falways_inline1 (void);
64 /* Verify that repeating attribute always_inline on a distinct declaration
65 doesn't trigger a warning. */
66 inline void ATTR ((always_inline
))
67 falways_inline1 (void); /* { dg-message "previous declaration here" } */
69 /* Verify a warning for noinline conflict. */
70 void ATTR ((noinline
))
71 falways_inline1 (void) { } /* { dg-warning "ignoring attribute .noinline. because it conflicts with attribute .always_inline." } */
74 void ATTR ((always_inline
))
75 falways_inline1 (void);
78 /* Exercise the handling of the mutually exclusive attributes
79 noinline and always_inline (in that order). */
81 void ATTR ((noinline
))
84 void ATTR ((__noinline__
))
87 /* Verify that repeating attribute noinline on the same declaration
88 doesn't trigger a warning. */
89 void ATTR ((noinline
, __noinline__
))
92 /* Verify that repeating attribute noinline on a distinct declaration
93 doesn't trigger a warning. */
94 void ATTR ((noinline
))
95 fnoinline1 (void); /* { dg-message "previous declaration here" } */
97 /* Verify a warning for always_inline conflict. */
98 void ATTR ((always_inline
))
99 fnoinline1 (void) { } /* { dg-warning "ignoring attribute .always_inline. because it conflicts with attribute .noinline." } */
100 /* { dg-note "previous declaration here" "" { target *-*-* } .-1 } */
101 /* { dg-note "previous definition" "" { target *-*-* } .-2 } */
103 /* Verify a warning for gnu_inline conflict. */
104 inline void ATTR ((gnu_inline
))
105 fnoinline1 (void); /* { dg-warning "ignoring attribute .gnu_inline. because it conflicts with attribute .noinline." } */
106 /* { dg-warning "follows declaration with attribute .noinline." "inline noinline" { target *-*-* } .-1 } */
109 void ATTR ((noinline
))
110 fnoinline1 (void); /* { dg-warning "follows inline declaration" } */
113 /* Exercise the handling of the mutually exclusive attributes
114 noreturn and warn_unused_result. */
116 int ATTR ((__noreturn__
))
119 int ATTR ((noreturn
))
120 fnoret1 (void); /* { dg-message "previous declaration here" } */
122 int ATTR ((warn_unused_result
))
123 fnoret1 (void); /* { dg-warning "ignoring attribute .warn_unused_result. because it conflicts with attribute .noreturn." } */
125 /* Verify that repeating attribute noreturn doesn't trigger a warning. */
126 int ATTR ((noreturn
)) fnoret1 (void);
128 int call_noret1 (void)
130 /* Verify that attribute warn_unused_result was, in fact, ignored
131 on the second declaration of fnoret1. */
135 int ATTR ((noreturn
, warn_unused_result
))
136 fnoret2 (void); /* { dg-warning "ignoring attribute .warn_unused_result. because it conflicts with attribute .noreturn." } */
138 /* Verify that repeating attribute noreturn doesn't trigger a warning. */
139 int ATTR ((noreturn
)) fnoret2 (void);
141 int call_noret2 (void)
143 /* Verify that attribute warn_unused_result was, in fact, ignored
144 on the second declaration of fnoret2. */
148 /* Verify that attribute noreturn isn't diagnosed on a declaration
149 that was previously declared warn_unused_result and that attribute
150 was dropped (because the function returs void). */
152 void ATTR ((warn_unused_result
))
153 fnorety6 (void); /* { dg-warning ".warn_unused_result. attribute ignored" } */
155 void ATTR ((noreturn
))
159 /* Exercise the handling of the mutually exclusive attributes
160 noreturn and alloc_align. */
162 void* ATTR ((noreturn
))
163 fnoret_alloc_align1 (int); /* { dg-message "previous declaration here" } */
165 void* ATTR ((alloc_align (1)))
166 fnoret_alloc_align1 (int); /* { dg-warning "ignoring attribute .alloc_align. because it conflicts with attribute .noreturn." } */
168 void* ATTR ((noreturn
, alloc_align (1)))
169 fnoret_alloc_align2 (int); /* { dg-warning "ignoring attribute .alloc_align. because it conflicts with attribute .noreturn." } */
172 void* ATTR ((noreturn
)) ATTR ((alloc_align (1)))
173 fnoret_alloc_align3 (int); /* { dg-warning "ignoring attribute .alloc_align. because it conflicts with attribute .noreturn." } */
176 void* ATTR ((alloc_align (1)))
177 falloc_align_noret1 (int); /* { dg-message "previous declaration here" } */
179 void* ATTR ((noreturn
))
180 falloc_align_noret1 (int); /* { dg-warning "ignoring attribute .noreturn. because it conflicts with attribute .alloc_align." } */
183 void* ATTR ((alloc_align (1), noreturn
))
184 falloc_align_noret2 (int); /* { dg-warning "ignoring attribute .(noreturn|alloc_align). because it conflicts with attribute .(alloc_align|noreturn)." } */
186 void* ATTR ((alloc_align (1))) ATTR ((noreturn
))
187 falloc_align_noret3 (int); /* { dg-warning "ignoring attribute .(noreturn|alloc_align). because it conflicts with attribute .(noreturn|alloc_align)." } */
190 /* Exercise the handling of the mutually exclusive attributes
191 noreturn and alloc_size. */
193 void* ATTR ((noreturn
))
194 fnoret_alloc_size1 (int); /* { dg-message "previous declaration here" } */
196 void* ATTR ((alloc_size (1)))
197 fnoret_alloc_size1 (int); /* { dg-warning "ignoring attribute .alloc_size. because it conflicts with attribute .noreturn." } */
199 void* ATTR ((noreturn
, alloc_size (1)))
200 fnoret_alloc_size2 (int); /* { dg-warning "ignoring attribute .alloc_size. because it conflicts with attribute .noreturn." } */
203 void* ATTR ((noreturn
)) ATTR ((alloc_size (1)))
204 fnoret_alloc_size3 (int); /* { dg-warning "ignoring attribute .alloc_size. because it conflicts with attribute .noreturn." } */
207 void* ATTR ((alloc_size (1)))
208 falloc_size_noret1 (int); /* { dg-message "previous declaration here" } */
210 void* ATTR ((noreturn
))
211 falloc_size_noret1 (int); /* { dg-warning "ignoring attribute .noreturn. because it conflicts with attribute .alloc_size." } */
214 void* ATTR ((alloc_size (1), noreturn
))
215 falloc_size_noret2 (int); /* { dg-warning "ignoring attribute .noreturn. because it conflicts with attribute .alloc_size." } */
217 void* ATTR ((alloc_size (1))) ATTR ((noreturn
))
218 falloc_size_noret3 (int); /* { dg-warning "ignoring attribute .noreturn. because it conflicts with attribute .alloc_size." } */
221 /* Exercise the handling of the mutually exclusive attributes
222 noreturn and const. */
224 int ATTR ((noreturn
))
225 fnoret_const1 (int); /* { dg-message "previous declaration here" } */
228 fnoret_const1 (int); /* { dg-warning "ignoring attribute .const. because it conflicts with attribute .noreturn." } */
230 /* Unfortunately, attributes on a single declarations may not be processed
231 in the same order as specified... */
232 int ATTR ((noreturn
, const))
233 fnoret_const2 (int); /* { dg-warning "ignoring attribute .const. because it conflicts with attribute .noreturn." } */
236 int ATTR ((noreturn
)) ATTR ((const))
237 fnoret_const3 (int); /* { dg-warning "ignoring attribute .const. because it conflicts with attribute .noreturn." } */
241 fconst_noret1 (int); /* { dg-message "previous declaration here" } */
243 int ATTR ((noreturn
))
244 fconst_noret1 (int); /* { dg-warning "ignoring attribute .noreturn. because it conflicts with attribute .const." } */
247 int ATTR ((const, noreturn
))
248 fconst_noret2 (int); /* { dg-warning "ignoring attribute .noreturn. because it conflicts with attribute .const." } */
250 int ATTR ((const)) ATTR ((noreturn
))
251 fconst_noret3 (int); /* { dg-warning "ignoring attribute .noreturn. because it conflicts with attribute .const." } */
254 /* Exercise the handling of the mutually exclusive attributes
255 noreturn and malloc. */
257 void* ATTR ((noreturn
))
258 fnoret_malloc1 (int); /* { dg-message "previous declaration here" } */
260 void* ATTR ((malloc
))
261 fnoret_malloc1 (int); /* { dg-warning "ignoring attribute .malloc. because it conflicts with attribute .noreturn." } */
263 /* Unfortunately, attributes on a single declarations may not be processed
264 in the same order as specified... */
265 void* ATTR ((noreturn
, malloc
))
266 fnoret_malloc2 (int); /* { dg-warning "ignoring attribute .malloc. because it conflicts with attribute .noreturn." } */
269 void* ATTR ((noreturn
)) ATTR ((malloc
))
270 fnoret_malloc3 (int); /* { dg-warning "ignoring attribute .malloc. because it conflicts with attribute .noreturn." } */
273 void* ATTR ((__malloc__
))
274 fmalloc_noret1 (int);
276 void* ATTR ((malloc
))
277 fmalloc_noret1 (int); /* { dg-message "previous declaration here" } */
279 void* ATTR ((noreturn
))
280 fmalloc_noret1 (int); /* { dg-warning "ignoring attribute .noreturn. because it conflicts with attribute .malloc." } */
283 void* ATTR ((malloc
, noreturn
))
284 fmalloc_noret2 (int); /* { dg-warning "ignoring attribute .noreturn. because it conflicts with attribute .malloc." } */
286 void* ATTR ((malloc
)) ATTR ((noreturn
))
287 fmalloc_noret3 (int); /* { dg-warning "ignoring attribute .noreturn. because it conflicts with attribute .malloc." } */
290 /* Exercise the handling of the mutually exclusive attributes
291 noreturn and pure. */
293 int ATTR ((noreturn
))
294 fnoret_pure1 (int); /* { dg-message "previous declaration here" } */
297 fnoret_pure1 (int); /* { dg-warning "ignoring attribute .pure. because it conflicts with attribute .noreturn." } */
299 /* Unfortunately, attributes on a single declarations may not be processed
300 in the same order as specified... */
301 int ATTR ((noreturn
, pure
))
302 fnoret_pure2 (int); /* { dg-warning "ignoring attribute .pure. because it conflicts with attribute .noreturn." } */
305 int ATTR ((noreturn
)) ATTR ((pure
))
306 fnoret_pure3 (int); /* { dg-warning "ignoring attribute .pure. because it conflicts with attribute .noreturn." } */
309 int ATTR ((__pure__
))
313 fpure_noret1 (int); /* { dg-message "previous declaration here" } */
315 int ATTR ((noreturn
))
316 fpure_noret1 (int); /* { dg-warning "ignoring attribute .noreturn. because it conflicts with attribute .pure." } */
319 int ATTR ((pure
, noreturn
))
320 fpure_noret2 (int); /* { dg-warning "ignoring attribute .noreturn. because it conflicts with attribute .pur." } */
322 int ATTR ((pure
)) ATTR ((noreturn
))
323 fpure_noret3 (int); /* { dg-warning "ignoring attribute .noreturn. because it conflicts with attribute .pure." } */
326 /* Exercise the handling of the mutually exclusive attributes
327 noreturn and returns_twice. */
329 int ATTR ((noreturn
))
330 fnoret_returns_twice1 (int); /* { dg-message "previous declaration here" } */
332 int ATTR ((returns_twice
))
333 fnoret_returns_twice1 (int); /* { dg-warning "ignoring attribute .returns_twice. because it conflicts with attribute .noreturn." } */
335 /* Unfortunately, attributes on a single declarations may not be processed
336 in the same order as specified... */
337 int ATTR ((noreturn
, returns_twice
))
338 fnoret_returns_twice2 (int); /* { dg-warning "ignoring attribute .returns_twice. because it conflicts with attribute .noreturn." } */
341 int ATTR ((noreturn
)) ATTR ((returns_twice
))
342 fnoret_returns_twice3 (int); /* { dg-warning "ignoring attribute .returns_twice. because it conflicts with attribute .noreturn." } */
345 int ATTR ((returns_twice
))
346 freturns_twice_noret1 (int); /* { dg-message "previous declaration here" } */
348 int ATTR ((noreturn
))
349 freturns_twice_noret1 (int); /* { dg-warning "ignoring attribute .noreturn. because it conflicts with attribute .returns_twice." } */
352 int ATTR ((returns_twice
, noreturn
))
353 freturns_twice_noret2 (int); /* { dg-warning "ignoring attribute .noreturn. because it conflicts with attribute .returns_twice." } */
355 int ATTR ((returns_twice
)) ATTR ((noreturn
))
356 freturns_twice_noret3 (int); /* { dg-warning "ignoring attribute .noreturn. because it conflicts with attribute .returns_twice." } */
359 /* Exercise the interaction of multiple combinations of mutually
360 exclusive attributes specified on distinct declarations. */
362 inline int ATTR ((always_inline
))
363 finline_cold_noreturn (int);
365 inline int ATTR ((cold
))
366 finline_cold_noreturn (int);
368 inline int ATTR ((noreturn
))
369 finline_cold_noreturn (int); /* { dg-note "previous declaration here" } */
371 inline int ATTR ((noinline
))
372 finline_cold_noreturn (int); /* { dg-warning "ignoring attribute .noinline. because it conflicts with attribute .always_inline." } */
373 /* { dg-note "previous declaration here" "" { target *-*-* } .-1 } */
375 inline int ATTR ((hot
))
376 finline_cold_noreturn (int); /* { dg-warning "ignoring attribute .hot. because it conflicts with attribute .cold." } */
377 /* { dg-note "previous declaration here" "" { target *-*-* } .-1 } */
379 inline int ATTR ((warn_unused_result
))
380 finline_cold_noreturn (int); /* { dg-warning "ignoring attribute .warn_unused_result. because it conflicts with attribute .noreturn." } */
382 inline int ATTR ((always_inline
))
383 finline_cold_noreturn (int);
385 /* Expect no warning for the missing return statement below because
386 the function is noreturn. */
387 inline int ATTR ((noreturn
))
388 finline_cold_noreturn (int i
) { (void)&i
; __builtin_abort (); }
391 /* Exercise the interaction of multiple combinations of mutually
392 exclusive attributes with some specified on the same declaration
393 and some on distinct declarations. */
395 inline int ATTR ((always_inline
, hot
))
396 finline_hot_noret_align (int); /* { dg-note "previous declaration here" } */
398 inline int ATTR ((noreturn
, noinline
))
399 finline_hot_noret_align (int); /* { dg-warning "ignoring attribute .noinline. because it conflicts with attribute .always_inline." } */
400 /* { dg-note "previous declaration here" "" { target *-*-* } .-1 } */
402 inline int ATTR ((cold
, aligned (8)))
403 finline_hot_noret_align (int); /* { dg-warning "ignoring attribute .cold. because it conflicts with attribute .hot." } */
404 /* { dg-note "previous declaration here" "" { target *-*-* } .-1 } */
406 inline int ATTR ((warn_unused_result
))
407 finline_hot_noret_align (int); /* { dg-warning "ignoring attribute .warn_unused_result. because it conflicts with attribute .noreturn." } */
408 /* { dg-note "previous declaration here" "" { target *-*-* } .-1 } */
410 inline int ATTR ((aligned (4)))
411 finline_hot_noret_align (int); /* { dg-warning "ignoring attribute .aligned \\(4\\). because it conflicts with attribute .aligned \\(8\\)." "" { target { ! { hppa*64*-*-* } } } } */
413 inline int ATTR ((aligned (8)))
414 finline_hot_noret_align (int); /* { dg-note "previous declaration here" } */
416 inline int ATTR ((const))
417 finline_hot_noret_align (int); /* { dg-warning "ignoring attribute .const. because it conflicts with attribute .noreturn." } */
419 /* Expect no warning for the missing return statement below because
420 the function is noreturn. */
421 inline int ATTR ((noreturn
))
422 finline_hot_noret_align (int i
) { (void)&i
; __builtin_abort (); }
425 /* Expect a warning about conflicting alignment but without
426 other declarations inbetween. */
427 inline int ATTR ((aligned (32)))
428 finline_align (int); /* { dg-note "previous declaration here" } */
430 inline int ATTR ((aligned (4)))
431 finline_align (int); /* { dg-warning "ignoring attribute .aligned \\(4\\). because it conflicts with attribute .aligned \\(32\\)." "" } */
433 inline int ATTR ((noreturn
))
434 finline_align (int i
) { (void)&i
; __builtin_abort (); }
437 /* Expect no note that would refer to the same declaration. */
438 inline int ATTR ((aligned (32), aligned (4)))
439 finline_double_align (int); /* { dg-warning "ignoring attribute .aligned \\(4\\). because it conflicts with attribute .aligned \\(32\\)." } */
441 inline int ATTR ((noreturn
))
442 finline_double_align (int i
) { (void)&i
; __builtin_abort (); }
445 /* Exercise variable attributes. */
447 extern int ATTR ((common
))
448 decl_common1
; /* { dg-message "previous declaration here" } */
450 extern int ATTR ((nocommon
))
451 decl_common1
; /* { dg-warning "ignoring attribute .nocommon. because it conflicts with attribute .common." } */
454 extern int ATTR ((nocommon
))
455 decl_common2
; /* { dg-message "previous declaration here" } */
457 extern int ATTR ((common
))
458 decl_common2
; /* { dg-warning "ignoring attribute .common. because it conflicts with attribute .nocommon." } */
461 extern int ATTR ((common
, nocommon
))
462 decl_common3
; /* { dg-warning "ignoring attribute .nocommon. because it conflicts with attribute .common." } */
465 extern int ATTR ((common
, nocommon
))
466 decl_common4
; /* { dg-warning "ignoring attribute .nocommon. because it conflicts with attribute .common." } */