gcc_attribute.c revision 1.5 1 1.5 rillig /* $NetBSD: gcc_attribute.c,v 1.5 2021/05/03 07:08:54 rillig Exp $ */
2 1.1 rillig # 3 "gcc_attribute.c"
3 1.1 rillig
4 1.1 rillig /*
5 1.1 rillig * Tests for the various attributes for functions, types, statements that are
6 1.1 rillig * provided by GCC.
7 1.1 rillig *
8 1.1 rillig * https://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html
9 1.1 rillig * https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
10 1.1 rillig * https://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html
11 1.1 rillig * https://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html
12 1.1 rillig * https://gcc.gnu.org/onlinedocs/gcc/Enumerator-Attributes.html
13 1.1 rillig * https://gcc.gnu.org/onlinedocs/gcc/Statement-Attributes.html
14 1.1 rillig * https://gcc.gnu.org/onlinedocs/gcc/Label-Attributes.html
15 1.1 rillig */
16 1.1 rillig
17 1.1 rillig void __attribute__((noinline))
18 1.1 rillig do_not_inline(void)
19 1.1 rillig {
20 1.1 rillig }
21 1.1 rillig
22 1.2 rillig /* All pointer arguments must be nonnull. */
23 1.2 rillig void __attribute__((nonnull))
24 1.2 rillig function_nonnull(void *, const void *, int);
25 1.2 rillig
26 1.3 rillig /*
27 1.3 rillig * The documentation suggests that the argument list of nonnull be nonempty,
28 1.3 rillig * but GCC 9.3.0 accepts an empty list as well, treating all parameters as
29 1.3 rillig * nonnull.
30 1.3 rillig */
31 1.3 rillig void __attribute__((nonnull()))
32 1.3 rillig function_nonnull_list(void *, const void *, int);
33 1.3 rillig
34 1.2 rillig /* Arguments 1 and 2 must be nonnull. */
35 1.1 rillig void __attribute__((nonnull(1, 2)))
36 1.2 rillig function_nonnull_list(void *, const void *, int);
37 1.1 rillig
38 1.1 rillig /* expect+1: syntax error 'unknown_attribute' */
39 1.1 rillig void __attribute__((unknown_attribute))
40 1.1 rillig function_with_unknown_attribute(void);
41 1.4 rillig
42 1.4 rillig /*
43 1.4 rillig * There is an attribute called 'pcs', but that attribute must not prevent an
44 1.5 rillig * ordinary variable from being named the same. Starting with scan.l 1.77
45 1.5 rillig * from 2017-01-07, that variable name generated a syntax error. Fixed in
46 1.5 rillig * lex.c 1.33 from 2021-05-03.
47 1.4 rillig *
48 1.4 rillig * Seen in yds.c, function yds_allocate_slots.
49 1.4 rillig */
50 1.5 rillig int
51 1.4 rillig local_variable_pcs(void)
52 1.4 rillig {
53 1.5 rillig int pcs = 3;
54 1.4 rillig return pcs;
55 1.4 rillig }
56