1 /* Verify __builtin_has_attribute return value for functions.
3 { dg-options "-Wall -ftrack-macro-expansion=0" }
4 { dg-options "-Wall -Wno-narrowing -Wno-unused-local-typedefs -ftrack-macro-expansion=0" { target c++ } } */
6 #define ATTR(...) __attribute__ ((__VA_ARGS__))
10 ATTR (aligned
) void faligned (void);
11 ATTR (aligned (1)) void faligned_1 (void);
12 ATTR (aligned (2)) void faligned_2 (void);
13 ATTR (aligned (4)) void faligned_4 (void);
14 ATTR (aligned (8)) void faligned_8 (void);
16 ATTR (alloc_size (1)) void* falloc_size_1 (int, int);
17 ATTR (alloc_size (2)) void* falloc_size_2 (int, int);
18 ATTR (alloc_size (2, 4)) void* falloc_size_2_4 (int, int, int, int);
20 ATTR (alloc_align (1)) void* falloc_align_1 (int, int);
21 ATTR (alloc_align (2)) void* falloc_align_2 (int, int);
22 ATTR (alloc_align (1), alloc_size (2)) void* falloc_align_1_size_2 (int, int);
23 ATTR (alloc_align (2), alloc_size (1)) void* falloc_align_2_size_1 (int, int);
28 ATTR (noreturn
) void fnoreturn (void) { __builtin_abort (); }
30 ATTR (alias ("fnoreturn")) void falias (void);
32 #define A(expect, sym, attr) \
33 typedef int Assert [1 - 2 * !(__builtin_has_attribute (sym, attr) == expect)]
35 void test_aligned (void)
37 A (0, fnone
, aligned
);
38 A (0, fnone
, aligned (0));
39 A (0, fnone
, aligned (1));
40 A (0, fnone
, aligned (2));
41 A (0, fnone
, aligned (4));
42 A (0, fnone
, aligned (8));
43 A (0, fnone
, aligned (16));
45 A (1, faligned
, aligned
);
46 A (0, faligned
, aligned (0));
47 A (0, faligned
, aligned (1));
48 A (0, faligned
, aligned (2));
50 A (1, faligned_1
, aligned
);
51 A (0, faligned_1
, aligned (0));
52 A (1, faligned_1
, aligned (1));
53 A (0, faligned_1
, aligned (2));
54 A (0, faligned_1
, aligned (4));
56 A (1, faligned_2
, aligned
);
57 A (0, faligned_2
, aligned (0));
58 A (0, faligned_2
, aligned (1));
59 A (1, faligned_2
, aligned (2));
60 A (0, faligned_2
, aligned (4));
64 void test_alloc_align (void)
66 A (0, fnone
, alloc_align
);
67 A (0, falloc_size_1
, alloc_align
);
68 A (1, falloc_align_1
, alloc_align
);
69 A (1, falloc_align_2
, alloc_align
);
71 A (0, fnone
, alloc_align (1)); /* { dg-warning "\\\[-Wattributes" } */
72 A (0, falloc_size_1
, alloc_align (1));
73 A (1, falloc_align_1
, alloc_align (1));
74 A (0, falloc_align_2
, alloc_align (1));
75 A (1, falloc_align_2
, alloc_align (2));
79 void test_alloc_size_malloc (void)
81 A (0, fnone
, alloc_size
);
82 A (0, fnone
, alloc_size (1)); /* { dg-warning "\\\[-Wattributes" } */
83 A (0, fnone
, alloc_size (2)); /* { dg-warning "\\\[-Wattributes" } */
84 A (0, falloc_align_1
, alloc_size (1));
85 A (0, falloc_align_2
, alloc_size (1));
86 A (1, falloc_size_1
, alloc_size (1));
87 A (0, falloc_size_1
, alloc_size (2));
88 A (0, falloc_size_2
, alloc_size (1));
89 A (1, falloc_size_2
, alloc_size (2));
91 A (1, falloc_size_2_4
, alloc_size
);
92 /* It would probably make more sense to have the built-in return
93 true only when both alloc_size arguments match, not just one
95 A (0, falloc_size_2_4
, alloc_size (1));
96 A (1, falloc_size_2_4
, alloc_size (2));
97 A (0, falloc_size_2_4
, alloc_size (3));
98 A (1, falloc_size_2_4
, alloc_size (4));
99 A (1, falloc_size_2_4
, alloc_size (2, 4));
101 extern ATTR (alloc_size (3))
102 void* fmalloc_size_3 (int, int, int);
104 A (1, fmalloc_size_3
, alloc_size
);
105 A (0, fmalloc_size_3
, alloc_size (1));
106 A (0, fmalloc_size_3
, alloc_size (2));
107 A (1, fmalloc_size_3
, alloc_size (3));
108 A (0, fmalloc_size_3
, malloc
);
111 void* fmalloc_size_3 (int, int, int);
113 A (1, fmalloc_size_3
, alloc_size (3));
114 A (1, fmalloc_size_3
, malloc
);
118 void test_alias (void)
120 A (0, fnoreturn
, alias
);
121 A (1, falias
, alias
);
122 A (1, falias
, alias ("fnoreturn"));
123 A (0, falias
, alias ("falias"));
124 A (0, falias
, alias ("fnone"));
128 void test_cold_hot (void)
130 extern ATTR (cold
) void fcold (void);
131 extern ATTR (hot
) void fhot (void);
144 void test_const_leaf_pure (void)
146 extern ATTR (const) int fconst (void);
147 extern ATTR (leaf
) int fleaf (void);
148 extern ATTR (pure
) int fpure (void);
154 A (1, fconst
, const);
166 extern ATTR (const, leaf
) int fconst_leaf (void);
168 A (1, fconst_leaf
, const);
169 A (1, fconst_leaf
, leaf
);
171 extern ATTR (leaf
, const) int fleaf_const (void);
173 A (1, fleaf_const
, const);
174 A (1, fleaf_const
, leaf
);
178 void test_ctor_dtor (void)
180 extern ATTR (constructor
) void fctor (void);
181 extern ATTR (destructor
) void fdtor (void);
182 extern ATTR (constructor
, destructor
) void fctor_dtor (void);
184 A (0, fnone
, constructor
);
185 A (0, fnone
, destructor
);
187 A (1, fctor
, constructor
);
188 A (1, fdtor
, destructor
);
190 extern ATTR (constructor
) void fctor_dtor (void);
191 extern ATTR (destructor
) void fctor_dtor (void);
192 extern ATTR (constructor
, destructor
) void fctor_dtor (void);
194 A (1, fctor_dtor
, constructor
);
195 A (1, fctor_dtor
, destructor
);
197 extern ATTR (constructor (123)) void fctor_123 (void);
198 A (1, fctor_123
, constructor
);
199 A (0, fctor_123
, destructor
);
200 A (1, fctor_123
, constructor (123));
201 A (0, fctor_123
, constructor (124));
203 extern ATTR (destructor (234)) void fctor_123 (void);
204 A (1, fctor_123
, constructor (123));
205 A (1, fctor_123
, destructor
);
206 A (1, fctor_123
, destructor (234));
207 A (0, fctor_123
, destructor (235));
211 void test_externally_visible (void)
213 extern void fexternally_visible (void);
215 A (0, fexternally_visible
, externally_visible
);
217 extern ATTR (externally_visible
) void fexternally_visible (void);
219 A (1, fexternally_visible
, externally_visible
);
223 void test_flatten (void)
225 extern void fflatten (void);
227 A (0, fflatten
, flatten
);
229 extern ATTR (flatten
) void fflatten (void);
231 A (1, fflatten
, flatten
);
233 extern void fflatten (void);
235 A (1, fflatten
, flatten
);
239 ATTR (format (printf
, 2, 4)) void
240 fformat_printf_2_3 (int, const char*, int, ...);
242 void test_format (void)
244 A (0, fnone
, format
);
245 A (0, fnone
, format (printf
));
246 A (0, fnone
, format (printf
, 2));
250 inline void finline (void) { }
251 inline ATTR (always_inline
) void falways_inline (void) { }
252 inline ATTR (always_inline
, gnu_inline
) void falways_gnu_inline (void) { }
253 ATTR (noinline
) void fnoinline () { }
255 void test_inline (void)
257 A (0, fnone
, always_inline
);
258 A (0, fnone
, gnu_inline
);
259 A (0, fnone
, noinline
);
261 A (0, finline
, always_inline
);
262 A (0, finline
, gnu_inline
);
263 A (0, finline
, noinline
);
265 A (1, falways_inline
, always_inline
);
266 A (0, falways_inline
, gnu_inline
);
267 A (0, falways_inline
, noinline
);
269 A (1, falways_gnu_inline
, always_inline
);
270 A (1, falways_gnu_inline
, gnu_inline
);
271 A (0, falways_gnu_inline
, noinline
);
273 A (0, fnoinline
, always_inline
);
274 A (0, fnoinline
, gnu_inline
);
275 A (1, fnoinline
, noinline
);
279 ATTR (no_instrument_function
) void fno_instrument (void);
281 ATTR (visibility ("default")) void fdefault (void);
282 ATTR (visibility ("hidden")) void fhidden (void);
283 ATTR (visibility ("internal")) void finternal (void);
284 ATTR (visibility ("protected")) void fprotected (void);
286 void test_visibility (void)
288 A (0, fnone
, visibility ("default"));
289 A (0, fnone
, visibility ("hidden"));
290 A (0, fnone
, visibility ("internal"));
291 A (0, fnone
, visibility ("protected"));
293 A (1, fdefault
, visibility ("default"));
294 A (0, fdefault
, visibility ("hidden"));
295 A (0, fdefault
, visibility ("internal"));
296 A (0, fdefault
, visibility ("protected"));
298 A (0, fhidden
, visibility ("default"));
299 A (1, fhidden
, visibility ("hidden"));
300 A (0, fhidden
, visibility ("internal"));
301 A (0, fhidden
, visibility ("protected"));
303 A (0, finternal
, visibility ("default"));
304 A (0, finternal
, visibility ("hidden"));
305 A (1, finternal
, visibility ("internal"));
306 A (0, finternal
, visibility ("protected"));
308 A (0, fprotected
, visibility ("default"));
309 A (0, fprotected
, visibility ("hidden"));
310 A (0, fprotected
, visibility ("internal"));
311 A (1, fprotected
, visibility ("protected"));
314 /* { dg-prune-output "specifies less restrictive attribute" } */