decl_arg.c revision 1.17 1 1.17 rillig /* $NetBSD: decl_arg.c,v 1.17 2025/01/03 03:14:47 rillig Exp $ */
2 1.1 rillig # 3 "decl_arg.c"
3 1.1 rillig
4 1.1 rillig /*
5 1.12 rillig * Tests for declarations of function parameters.
6 1.1 rillig *
7 1.1 rillig * See arg_declaration in cgram.y.
8 1.1 rillig */
9 1.1 rillig
10 1.8 rillig /* lint1-extra-flags: -X 351 */
11 1.8 rillig
12 1.1 rillig typedef double number;
13 1.1 rillig
14 1.1 rillig void no_args(void);
15 1.1 rillig void type_unnamed(double );
16 1.1 rillig void type_named(double arg);
17 1.1 rillig void typedef_unnamed_prototype(number);
18 1.1 rillig void typedef_named(number arg);
19 1.1 rillig
20 1.1 rillig void type_qualifier(const number);
21 1.1 rillig void type_qualifier_pointer(const number *const);
22 1.1 rillig
23 1.1 rillig /*
24 1.1 rillig * Just some unrealistic coverage for the grammar rule 'arg_declaration'.
25 1.1 rillig */
26 1.1 rillig extern void
27 1.17 rillig /* expect+6: warning: function definition for 'old_style' with identifier list is obsolete in C23 [384] */
28 1.16 rillig /* expect+5: warning: parameter 'an_int' unused in function 'old_style' [231] */
29 1.16 rillig /* expect+4: warning: parameter 'a_const_int' unused in function 'old_style' [231] */
30 1.16 rillig /* expect+3: warning: parameter 'a_number' unused in function 'old_style' [231] */
31 1.16 rillig /* expect+2: warning: parameter 'a_function' unused in function 'old_style' [231] */
32 1.16 rillig /* expect+1: warning: parameter 'a_struct' unused in function 'old_style' [231] */
33 1.1 rillig old_style(an_int, a_const_int, a_number, a_function, a_struct)
34 1.13 rillig /* expect+2: error: only 'register' is valid as storage class in parameter [9] */
35 1.13 rillig /* expect+1: warning: empty declaration [2] */
36 1.1 rillig static;
37 1.1 rillig /* expect+1: error: syntax error '"' [249] */
38 1.1 rillig static "error";
39 1.1 rillig /* expect+1: warning: empty declaration [2] */
40 1.1 rillig const;
41 1.12 rillig /* expect+1: error: declared parameter 'undeclared' is missing [53] */
42 1.1 rillig const undeclared;
43 1.12 rillig /* expect+2: error: declared parameter 'undeclared_initialized' is missing [53] */
44 1.7 rillig /* expect+1: error: cannot initialize parameter 'undeclared_initialized' [52] */
45 1.1 rillig const undeclared_initialized = 12345;
46 1.1 rillig /* expect+1: warning: empty declaration [2] */
47 1.1 rillig int;
48 1.12 rillig /* expect+1: warning: 'struct arg_struct' declared in parameter declaration list [3] */
49 1.1 rillig struct arg_struct { int member; };
50 1.7 rillig /* expect+1: error: cannot initialize parameter 'an_int' [52] */
51 1.1 rillig int an_int = 12345;
52 1.1 rillig const int a_const_int;
53 1.1 rillig number a_number;
54 1.1 rillig void (a_function) (number);
55 1.12 rillig /* expect+1: warning: 'struct a_struct' declared in parameter declaration list [3] */
56 1.1 rillig struct a_struct { int member; } a_struct;
57 1.1 rillig {
58 1.1 rillig }
59 1.1 rillig
60 1.1 rillig /*
61 1.6 rillig * Just some unrealistic coverage for the grammar rule
62 1.6 rillig * 'notype_direct_declarator'.
63 1.1 rillig */
64 1.1 rillig extern int
65 1.17 rillig /* expect+1: warning: function definition for 'cover_notype_direct_decl' with identifier list is obsolete in C23 [384] */
66 1.1 rillig cover_notype_direct_decl(arg)
67 1.1 rillig int arg;
68 1.12 rillig /* expect+1: error: declared parameter 'name' is missing [53] */
69 1.1 rillig const name;
70 1.12 rillig /* expect+1: error: declared parameter 'parenthesized_name' is missing [53] */
71 1.1 rillig const (parenthesized_name);
72 1.12 rillig /* expect+1: error: declared parameter 'array' is missing [53] */
73 1.1 rillig const array[];
74 1.12 rillig /* expect+1: error: declared parameter 'array_size' is missing [53] */
75 1.1 rillig const array_size[1+1+1];
76 1.13 rillig /* expect+2: error: null dimension [17] */
77 1.13 rillig /* expect+1: error: declared parameter 'multi_array' is missing [53] */
78 1.1 rillig const multi_array[][][][][][];
79 1.12 rillig /* expect+1: error: declared parameter 'function' is missing [53] */
80 1.1 rillig const function(void);
81 1.12 rillig /* expect+1: error: declared parameter 'prefix_attribute' is missing [53] */
82 1.1 rillig const __attribute__((deprecated)) prefix_attribute;
83 1.12 rillig /* expect+1: error: declared parameter 'postfix_attribute' is missing [53] */
84 1.1 rillig const postfix_attribute __attribute__((deprecated));
85 1.12 rillig /* expect+1: error: declared parameter 'infix_attribute' is missing [53] */
86 1.1 rillig const __attribute__((deprecated)) infix_attribute __attribute__((deprecated));
87 1.1 rillig /* The __attribute__ before the '*' is consumed by some other grammar rule. */
88 1.12 rillig /* expect+7: error: declared parameter 'pointer_prefix_attribute' is missing [53] */
89 1.1 rillig const
90 1.1 rillig __attribute__((deprecated))
91 1.1 rillig *
92 1.1 rillig __attribute__((deprecated))
93 1.1 rillig __attribute__((deprecated))
94 1.1 rillig __attribute__((deprecated))
95 1.1 rillig pointer_prefix_attribute;
96 1.1 rillig {
97 1.1 rillig return arg;
98 1.1 rillig }
99 1.2 rillig
100 1.14 rillig // The attribute 'unused' belongs to the parameter.
101 1.14 rillig // The attribute 'format' belongs to the function type.
102 1.14 rillig void
103 1.14 rillig param_func_attr_unused(
104 1.2 rillig void (*pr)(const char *, ...)
105 1.14 rillig __attribute__((__unused__))
106 1.2 rillig __attribute__((__format__(__printf__, 1, 2)))
107 1.14 rillig )
108 1.14 rillig {
109 1.14 rillig }
110 1.14 rillig
111 1.14 rillig // The attribute 'unused' belongs to the parameter.
112 1.14 rillig // The attribute 'format' belongs to the function type.
113 1.14 rillig void
114 1.14 rillig param_func_attr_printf(
115 1.14 rillig void (*pr)(const char *, ...)
116 1.14 rillig __attribute__((__unused__))
117 1.14 rillig __attribute__((__format__(__printf__, 1, 2)))
118 1.14 rillig )
119 1.14 rillig {
120 1.14 rillig // GCC and Clang already warn about the malformed format string,
121 1.14 rillig // so there is nothing left to do for lint.
122 1.14 rillig pr("%");
123 1.14 rillig }
124 1.3 rillig
125 1.3 rillig /*
126 1.3 rillig * XXX: To cover the grammar rule 'direct_notype_param_decl', the parameters
127 1.3 rillig * need to be enclosed by one more pair of parentheses than usual.
128 1.3 rillig */
129 1.3 rillig void cover_direct_notype_param_decl(
130 1.4 rillig double (identifier),
131 1.3 rillig double ((parenthesized)),
132 1.3 rillig double (array[]),
133 1.3 rillig double (array_size[3]),
134 1.3 rillig double (*)(void (function()))
135 1.3 rillig );
136 1.4 rillig
137 1.4 rillig /*
138 1.4 rillig * Just some unrealistic code to cover the grammar rule parameter_declaration.
139 1.4 rillig */
140 1.9 rillig /* expect+4: error: only 'register' is valid as storage class in parameter [9] */
141 1.4 rillig void cover_parameter_declaration(
142 1.4 rillig volatile, /* 1 */
143 1.4 rillig double, /* 2 */
144 1.4 rillig static storage_class, /* 3.1 */
145 1.4 rillig const type_qualifier, /* 3.2 */
146 1.4 rillig double (identifier), /* 4 */
147 1.4 rillig const (*), /* 5 */
148 1.4 rillig double *const, /* 6 */
149 1.4 rillig ...
150 1.4 rillig );
151 1.5 rillig
152 1.5 rillig void cover_asm_or_symbolrename_asm(void)
153 1.5 rillig __asm("assembly code");
154 1.5 rillig
155 1.5 rillig void cover_asm_or_symbolrename_symbolrename(void)
156 1.5 rillig __symbolrename(alternate_name);
157 1.6 rillig
158 1.11 rillig
159 1.11 rillig double
160 1.17 rillig /* expect+1: warning: function definition for 'f' with identifier list is obsolete in C23 [384] */
161 1.11 rillig f(e, s, r, a, t, n)
162 1.11 rillig /* expect+1: error: only 'register' is valid as storage class in parameter [9] */
163 1.11 rillig extern double e;
164 1.11 rillig /* expect+1: error: only 'register' is valid as storage class in parameter [9] */
165 1.11 rillig static double s;
166 1.11 rillig register double r;
167 1.11 rillig /* expect+1: error: only 'register' is valid as storage class in parameter [9] */
168 1.11 rillig auto double a;
169 1.11 rillig /* expect+1: error: only 'register' is valid as storage class in parameter [9] */
170 1.11 rillig typedef double t;
171 1.11 rillig double n;
172 1.11 rillig {
173 1.11 rillig return e + s + r + a + t + n;
174 1.11 rillig }
175 1.11 rillig
176 1.11 rillig
177 1.6 rillig // FIXME: internal error in decl.c:906 near decl_arg.c:134: length(0)
178 1.6 rillig //void cover_abstract_declarator_typeof(void (*)(typeof(no_args)));
179