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