decl.c revision 1.23 1 1.23 rillig /* $NetBSD: decl.c,v 1.23 2023/07/13 22:44:10 rillig Exp $ */
2 1.1 rillig # 3 "decl.c"
3 1.1 rillig
4 1.1 rillig /*
5 1.1 rillig * Tests for declarations, especially the distinction between the
6 1.1 rillig * declaration-specifiers and the declarators.
7 1.1 rillig */
8 1.1 rillig
9 1.22 rillig /* lint1-extra-flags: -X 191,351 */
10 1.21 rillig
11 1.1 rillig /*
12 1.1 rillig * Even though 'const' comes after 'char' and is therefore quite close to the
13 1.1 rillig * first identifier, it applies to both identifiers.
14 1.1 rillig */
15 1.1 rillig void
16 1.1 rillig specifier_qualifier(void)
17 1.1 rillig {
18 1.1 rillig char const a = 1, b = 2;
19 1.1 rillig
20 1.1 rillig /* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */
21 1.1 rillig a = 1;
22 1.1 rillig /* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */
23 1.1 rillig b = 2;
24 1.1 rillig }
25 1.1 rillig
26 1.1 rillig /*
27 1.1 rillig * Since 'const' comes before 'char', there is no ambiguity whether the
28 1.1 rillig * 'const' applies to all variables or just to the first.
29 1.1 rillig */
30 1.1 rillig void
31 1.1 rillig qualifier_specifier(void)
32 1.1 rillig {
33 1.1 rillig const char a = 1, b = 2;
34 1.1 rillig
35 1.1 rillig /* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */
36 1.1 rillig a = 3;
37 1.1 rillig /* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */
38 1.1 rillig b = 5;
39 1.1 rillig }
40 1.1 rillig
41 1.1 rillig void
42 1.1 rillig declarator_with_prefix_qualifier(void)
43 1.1 rillig {
44 1.17 rillig /* expect+1: error: syntax error 'const' [249] */
45 1.1 rillig char a = 1, const b = 2;
46 1.1 rillig
47 1.1 rillig a = 1;
48 1.1 rillig /* expect+1: error: 'b' undefined [99] */
49 1.1 rillig b = 2;
50 1.1 rillig }
51 1.1 rillig
52 1.1 rillig void
53 1.1 rillig declarator_with_postfix_qualifier(void)
54 1.1 rillig {
55 1.17 rillig /* expect+1: error: syntax error 'const' [249] */
56 1.1 rillig char a = 1, b const = 2;
57 1.1 rillig
58 1.1 rillig a = 1;
59 1.1 rillig b = 2;
60 1.1 rillig }
61 1.1 rillig
62 1.1 rillig void sink(double *);
63 1.1 rillig
64 1.1 rillig void
65 1.1 rillig declarators(void)
66 1.1 rillig {
67 1.1 rillig char *pc = 0, c = 0, **ppc = 0;
68 1.1 rillig
69 1.17 rillig /* expect+1: warning: converting 'pointer to char' to incompatible 'pointer to double' for argument 1 [153] */
70 1.1 rillig sink(pc);
71 1.18 rillig /* expect+1: warning: illegal combination of pointer 'pointer to double' and integer 'char', arg #1 [154] */
72 1.1 rillig sink(c);
73 1.17 rillig /* expect+1: warning: converting 'pointer to pointer to char' to incompatible 'pointer to double' for argument 1 [153] */
74 1.1 rillig sink(ppc);
75 1.1 rillig }
76 1.2 rillig
77 1.2 rillig _Bool
78 1.2 rillig enum_error_handling(void)
79 1.2 rillig {
80 1.2 rillig enum {
81 1.17 rillig /* expect+1: error: syntax error '"' [249] */
82 1.2 rillig "error 1"
83 1.2 rillig : /* still the same error */
84 1.2 rillig , /* back on track */
85 1.2 rillig A,
86 1.2 rillig B
87 1.2 rillig } x = A;
88 1.2 rillig
89 1.2 rillig return x == B;
90 1.2 rillig }
91 1.3 rillig
92 1.4 rillig /*
93 1.4 rillig * An __attribute__ at the beginning of a declaration may become ambiguous
94 1.4 rillig * since a GCC fallthrough statement starts with __attribute__ as well.
95 1.4 rillig */
96 1.3 rillig void
97 1.3 rillig unused_local_variable(void)
98 1.3 rillig {
99 1.3 rillig __attribute__((unused)) _Bool unused_var;
100 1.3 rillig
101 1.3 rillig __attribute__((unused))
102 1.3 rillig __attribute__((unused)) _Bool unused_twice;
103 1.3 rillig }
104 1.5 rillig
105 1.5 rillig int
106 1.5 rillig declaration_without_type_specifier(void)
107 1.5 rillig {
108 1.5 rillig const i = 3;
109 1.20 rillig /* expect-1: error: old-style declaration; add 'int' [1] */
110 1.5 rillig return i;
111 1.5 rillig }
112 1.5 rillig
113 1.16 rillig
114 1.16 rillig /* expect+2: warning: static function 'unused' unused [236] */
115 1.5 rillig static void
116 1.5 rillig unused(void)
117 1.5 rillig {
118 1.5 rillig }
119 1.5 rillig
120 1.5 rillig /*
121 1.5 rillig * The attribute 'used' does not influence static functions, it only
122 1.5 rillig * applies to function parameters.
123 1.5 rillig */
124 1.5 rillig /* LINTED */
125 1.5 rillig static void
126 1.5 rillig unused_linted(void)
127 1.5 rillig {
128 1.5 rillig }
129 1.6 rillig
130 1.6 rillig /* covers 'type_qualifier_list: type_qualifier_list type_qualifier' */
131 1.6 rillig int *const volatile cover_type_qualifier_list;
132 1.7 rillig
133 1.8 rillig _Bool bool;
134 1.8 rillig char plain_char;
135 1.8 rillig signed char signed_char;
136 1.8 rillig unsigned char unsigned_char;
137 1.8 rillig short signed_short;
138 1.8 rillig unsigned short unsigned_short;
139 1.8 rillig int signed_int;
140 1.8 rillig unsigned int unsigned_int;
141 1.8 rillig long signed_long;
142 1.8 rillig unsigned long unsigned_long;
143 1.9 rillig struct {
144 1.9 rillig int member;
145 1.9 rillig } unnamed_struct;
146 1.8 rillig
147 1.8 rillig /*
148 1.8 rillig * Before decl.c 1.201 from 2021-07-15, lint crashed with an internal error
149 1.19 rillig * in dcs_end_type (named end_type back then).
150 1.8 rillig */
151 1.8 rillig unsigned long sizes =
152 1.8 rillig sizeof(const typeof(bool)) +
153 1.8 rillig sizeof(const typeof(plain_char)) +
154 1.8 rillig sizeof(const typeof(signed_char)) +
155 1.8 rillig sizeof(const typeof(unsigned_char)) +
156 1.8 rillig sizeof(const typeof(signed_short)) +
157 1.8 rillig sizeof(const typeof(unsigned_short)) +
158 1.8 rillig sizeof(const typeof(signed_int)) +
159 1.8 rillig sizeof(const typeof(unsigned_int)) +
160 1.8 rillig sizeof(const typeof(signed_long)) +
161 1.9 rillig sizeof(const typeof(unsigned_long)) +
162 1.9 rillig sizeof(const typeof(unnamed_struct));
163 1.10 rillig
164 1.20 rillig /* expect+2: error: old-style declaration; add 'int' [1] */
165 1.17 rillig /* expect+1: error: syntax error 'int' [249] */
166 1.10 rillig thread int thread_int;
167 1.10 rillig __thread int thread_int;
168 1.20 rillig /* expect+2: error: old-style declaration; add 'int' [1] */
169 1.17 rillig /* expect+1: error: syntax error 'int' [249] */
170 1.10 rillig __thread__ int thread_int;
171 1.12 rillig
172 1.20 rillig /* expect+4: error: old-style declaration; add 'int' [1] */
173 1.16 rillig /* expect+2: warning: static function 'cover_func_declarator' unused [236] */
174 1.12 rillig static
175 1.12 rillig cover_func_declarator(void)
176 1.12 rillig {
177 1.12 rillig }
178 1.13 rillig
179 1.13 rillig /*
180 1.13 rillig * Before decl.c 1.268 from 2022-04-03, lint ran into an assertion failure for
181 1.13 rillig * "elsz > 0" in 'length'.
182 1.13 rillig */
183 1.13 rillig /* expect+2: error: syntax error 'goto' [249] */
184 1.18 rillig /* expect+1: warning: empty array declaration for 'void_array_error' [190] */
185 1.13 rillig void void_array_error[] goto;
186 1.23 rillig
187 1.23 rillig const volatile int
188 1.23 rillig /* expect+1: warning: duplicate 'const' [10] */
189 1.23 rillig *const volatile const
190 1.23 rillig /* expect+1: warning: duplicate 'volatile' [10] */
191 1.23 rillig *volatile const volatile
192 1.23 rillig *duplicate_ptr;
193