lsym_lparen_or_lbracket.c revision 1.13 1 1.13 rillig /* $NetBSD: lsym_lparen_or_lbracket.c,v 1.13 2023/06/04 18:58:30 rillig Exp $ */
2 1.1 rillig
3 1.1 rillig /*
4 1.1 rillig * Tests for the token lsym_lparen_or_lbracket, which represents a '(' or '['
5 1.1 rillig * in these contexts:
6 1.1 rillig *
7 1.1 rillig * In a type name, '(' constructs a function type.
8 1.1 rillig *
9 1.1 rillig * In an expression, '(' starts an inner expression to override the usual
10 1.1 rillig * operator precedence.
11 1.1 rillig *
12 1.6 rillig * In a function call expression, '(' marks the beginning of the function
13 1.6 rillig * arguments.
14 1.1 rillig *
15 1.1 rillig * In a 'sizeof' expression, '(' is required if the argument is a type name.
16 1.1 rillig *
17 1.6 rillig * In an expression, '(' followed by a type name starts a cast expression or
18 1.6 rillig * a compound literal.
19 1.6 rillig *
20 1.6 rillig * In a type declaration, '(' marks the beginning of the function parameters.
21 1.6 rillig *
22 1.1 rillig * After one of the keywords 'for', 'if', 'switch' or 'while', the controlling
23 1.5 rillig * expression must be enclosed in '(' and ')'; see lsym_for.c, lsym_if.c,
24 1.5 rillig * lsym_switch.c, lsym_while.c.
25 1.1 rillig *
26 1.5 rillig * In a declaration, '[' derives an array type.
27 1.5 rillig *
28 1.5 rillig * In an expression, '[' starts an array subscript.
29 1.5 rillig */
30 1.5 rillig
31 1.5 rillig /* The '(' in a type name derives a function type. */
32 1.7 rillig //indent input
33 1.5 rillig typedef void signal_handler(int);
34 1.5 rillig void (*signal(void (*)(int)))(int);
35 1.7 rillig //indent end
36 1.5 rillig
37 1.7 rillig //indent run
38 1.5 rillig typedef void signal_handler(int);
39 1.5 rillig void (*signal(void (*)(int)))(int);
40 1.7 rillig //indent end
41 1.5 rillig
42 1.5 rillig
43 1.7 rillig //indent input
44 1.6 rillig #define macro(arg) ((arg) + 1)
45 1.7 rillig //indent end
46 1.6 rillig
47 1.7 rillig //indent run-equals-input -di0
48 1.6 rillig
49 1.6 rillig
50 1.5 rillig /*
51 1.5 rillig * The '(' in an expression overrides operator precedence. In multi-line
52 1.5 rillig * expressions, the continuation lines are aligned on the parentheses.
53 1.1 rillig */
54 1.7 rillig //indent input
55 1.5 rillig int nested = (
56 1.5 rillig (
57 1.5 rillig (
58 1.5 rillig (
59 1.5 rillig 1 + 4
60 1.5 rillig )
61 1.5 rillig )
62 1.5 rillig )
63 1.5 rillig );
64 1.7 rillig //indent end
65 1.5 rillig
66 1.7 rillig //indent run
67 1.5 rillig int nested = (
68 1.5 rillig (
69 1.5 rillig (
70 1.5 rillig (
71 1.5 rillig 1 + 4
72 1.5 rillig )
73 1.5 rillig )
74 1.5 rillig )
75 1.5 rillig );
76 1.7 rillig //indent end
77 1.5 rillig
78 1.5 rillig
79 1.5 rillig /* The '(' in a function call expression starts the argument list. */
80 1.7 rillig //indent input
81 1.5 rillig int var = macro_call ( arg1, arg2 ,arg3);
82 1.7 rillig //indent end
83 1.5 rillig
84 1.7 rillig //indent run
85 1.5 rillig int var = macro_call(arg1, arg2, arg3);
86 1.7 rillig //indent end
87 1.5 rillig
88 1.5 rillig
89 1.5 rillig /*
90 1.5 rillig * The '(' in a sizeof expression is required for type names and optional for
91 1.5 rillig * expressions.
92 1.5 rillig */
93 1.7 rillig //indent input
94 1.5 rillig size_t sizeof_typename = sizeof ( int );
95 1.5 rillig size_t sizeof_expr = sizeof ( 12345 ) ;
96 1.7 rillig //indent end
97 1.5 rillig
98 1.7 rillig //indent run
99 1.5 rillig size_t sizeof_typename = sizeof(int);
100 1.5 rillig size_t sizeof_expr = sizeof(12345);
101 1.7 rillig //indent end
102 1.5 rillig
103 1.5 rillig
104 1.5 rillig /* The '[' in a type name derives an array type. */
105 1.7 rillig //indent input
106 1.5 rillig int array_of_numbers[100];
107 1.7 rillig //indent end
108 1.5 rillig
109 1.7 rillig //indent run
110 1.5 rillig int array_of_numbers[100];
111 1.7 rillig //indent end
112 1.5 rillig
113 1.5 rillig
114 1.5 rillig /* The '[' in an expression accesses an array element. */
115 1.7 rillig //indent input
116 1.5 rillig int second_prime = &primes[1];
117 1.7 rillig //indent end
118 1.5 rillig
119 1.7 rillig //indent run
120 1.5 rillig int second_prime = &primes[1];
121 1.7 rillig //indent end
122 1.1 rillig
123 1.3 rillig
124 1.7 rillig //indent input
125 1.3 rillig void
126 1.3 rillig function(void)
127 1.3 rillig {
128 1.3 rillig /* Type casts */
129 1.3 rillig a = (int)b;
130 1.3 rillig a = (struct tag)b;
131 1.3 rillig /* TODO: The '(int)' is not a type cast, it is a prototype list. */
132 1.3 rillig a = (int (*)(int))fn;
133 1.3 rillig
134 1.3 rillig /* Not type casts */
135 1.3 rillig a = sizeof(int) * 2;
136 1.3 rillig a = sizeof(5) * 2;
137 1.3 rillig a = offsetof(struct stat, st_mtime);
138 1.3 rillig
139 1.3 rillig /* Grouping subexpressions */
140 1.3 rillig a = ((((b + c)))) * d;
141 1.3 rillig }
142 1.7 rillig //indent end
143 1.1 rillig
144 1.7 rillig //indent run-equals-input
145 1.2 rillig
146 1.6 rillig
147 1.6 rillig /* This is the maximum supported number of parentheses. */
148 1.7 rillig //indent input
149 1.6 rillig int zero = (((((((((((((((((((0)))))))))))))))))));
150 1.7 rillig //indent end
151 1.6 rillig
152 1.7 rillig //indent run-equals-input -di0
153 1.6 rillig
154 1.6 rillig
155 1.7 rillig //indent input
156 1.6 rillig void (*action)(void);
157 1.7 rillig //indent end
158 1.6 rillig
159 1.7 rillig //indent run-equals-input -di0
160 1.6 rillig
161 1.6 rillig
162 1.7 rillig //indent input
163 1.6 rillig void
164 1.6 rillig function(void)
165 1.6 rillig {
166 1.6 rillig other_function();
167 1.6 rillig other_function("first", 2, "last argument"[4]);
168 1.6 rillig
169 1.6 rillig if (false)(void)x;
170 1.6 rillig if (false)(func)(arg);
171 1.6 rillig if (false)(cond)?123:456;
172 1.6 rillig
173 1.6 rillig /* C99 compound literal */
174 1.6 rillig origin = (struct point){0,0};
175 1.6 rillig
176 1.6 rillig /* GCC statement expression */
177 1.6 rillig /* expr = ({if(expr)debug();expr;}); */
178 1.6 rillig /* $ XXX: Generates 'error: Standard Input:36: Unbalanced parentheses'. */
179 1.6 rillig }
180 1.7 rillig //indent end
181 1.6 rillig
182 1.7 rillig //indent run
183 1.6 rillig void
184 1.6 rillig function(void)
185 1.6 rillig {
186 1.6 rillig other_function();
187 1.6 rillig other_function("first", 2, "last argument"[4]);
188 1.6 rillig
189 1.6 rillig if (false)
190 1.6 rillig (void)x;
191 1.6 rillig if (false)
192 1.6 rillig (func)(arg);
193 1.6 rillig if (false)
194 1.6 rillig (cond) ? 123 : 456;
195 1.6 rillig
196 1.6 rillig /* C99 compound literal */
197 1.10 rillig origin = (struct point){0, 0};
198 1.6 rillig
199 1.6 rillig /* GCC statement expression */
200 1.6 rillig /* expr = ({if(expr)debug();expr;}); */
201 1.6 rillig }
202 1.7 rillig //indent end
203 1.6 rillig
204 1.6 rillig
205 1.6 rillig /*
206 1.10 rillig * Test a few variants of C99 compound expressions, as the '{' and '}' must not
207 1.10 rillig * be treated as block delimiters.
208 1.10 rillig */
209 1.10 rillig //indent input
210 1.10 rillig {
211 1.10 rillig return (struct point){0, 0};
212 1.10 rillig return (struct point){
213 1.10 rillig 0, 0
214 1.10 rillig };
215 1.10 rillig return (struct point){.x = 0, .y = 0};
216 1.10 rillig return (struct point){
217 1.10 rillig .x = 0,
218 1.11 rillig .y = 0,
219 1.10 rillig };
220 1.10 rillig }
221 1.10 rillig //indent end
222 1.10 rillig
223 1.10 rillig //indent run-equals-input
224 1.10 rillig
225 1.10 rillig
226 1.10 rillig /*
227 1.6 rillig * C99 designator initializers are the rare situation where there is a space
228 1.6 rillig * before a '['.
229 1.6 rillig */
230 1.7 rillig //indent input
231 1.6 rillig int array[] = {
232 1.6 rillig 1, 2, [2] = 3, [3] = 4,
233 1.6 rillig };
234 1.7 rillig //indent end
235 1.6 rillig
236 1.7 rillig //indent run-equals-input -di0
237 1.6 rillig
238 1.6 rillig
239 1.6 rillig /*
240 1.6 rillig * Test want_blank_before_lparen for all possible token types.
241 1.6 rillig */
242 1.7 rillig //indent input
243 1.6 rillig void cover_want_blank_before_lparen(void)
244 1.6 rillig {
245 1.12 rillig /* ps.prev_lsym can never be 'newline'. */
246 1.6 rillig int newline =
247 1.6 rillig (3);
248 1.6 rillig
249 1.6 rillig int lparen_or_lbracket = a[(3)];
250 1.6 rillig int rparen_or_rbracket = a[3](5);
251 1.6 rillig +(unary_op);
252 1.6 rillig 3 + (binary_op);
253 1.6 rillig a++(postfix_op); /* unlikely to be seen in practice */
254 1.6 rillig cond ? (question) : (5);
255 1.6 rillig switch (expr) {
256 1.6 rillig case (case_label):;
257 1.6 rillig }
258 1.6 rillig a ? 3 : (colon);
259 1.6 rillig (semicolon) = 3;
260 1.6 rillig int lbrace[] = {(3)};
261 1.6 rillig int rbrace_in_decl = {{3}(4)}; /* syntax error */
262 1.6 rillig {}
263 1.6 rillig (rbrace_in_stmt)();
264 1.6 rillig ident(3);
265 1.6 rillig int(decl);
266 1.6 rillig a++, (comma)();
267 1.6 rillig int comment = /* comment */ (3); /* comment is skipped */
268 1.6 rillig switch (expr) {}
269 1.6 rillig #define preprocessing
270 1.6 rillig (preprocessing)();
271 1.9 rillig (lsym_form_feed)();
273 1.6 rillig for(;;);
274 1.6 rillig do(lsym_do)=3;while(0);
275 1.6 rillig if(cond);else(lsym_else)();
276 1.6 rillig do(lsym_do);while(0);
277 1.6 rillig str.(member); /* syntax error */
278 1.6 rillig L("string_prefix"); /* impossible */
279 1.6 rillig static (int)storage_class; /* syntax error */
280 1.6 rillig funcname(3);
281 1.6 rillig typedef (type_def) new_type;
282 1.6 rillig // $ TODO: is keyword_struct_union_enum possible?
283 1.6 rillig struct (keyword_struct_union_enum); /* syntax error */
284 1.7 rillig }
285 1.6 rillig //indent end
286 1.7 rillig
287 1.6 rillig //indent run -ldi0
288 1.6 rillig void
289 1.6 rillig cover_want_blank_before_lparen(void)
290 1.12 rillig {
291 1.6 rillig /* ps.prev_lsym can never be 'newline'. */
292 1.6 rillig int newline =
293 1.6 rillig (3);
294 1.6 rillig
295 1.6 rillig int lparen_or_lbracket = a[(3)];
296 1.6 rillig int rparen_or_rbracket = a[3](5);
297 1.6 rillig +(unary_op);
298 1.6 rillig 3 + (binary_op);
299 1.6 rillig a++ (postfix_op); /* unlikely to be seen in practice */
300 1.6 rillig cond ? (question) : (5);
301 1.13 rillig switch (expr) {
302 1.6 rillig case (case_label): ;
303 1.6 rillig }
304 1.6 rillig a ? 3 : (colon);
305 1.6 rillig (semicolon) = 3;
306 1.6 rillig int lbrace[] = {(3)};
307 1.6 rillig int rbrace_in_decl = {{3} (4)}; /* syntax error */
308 1.6 rillig {
309 1.6 rillig }
310 1.6 rillig (rbrace_in_stmt)();
311 1.6 rillig ident(3);
312 1.6 rillig int (decl);
313 1.6 rillig a++, (comma)();
314 1.6 rillig int comment = /* comment */ (3); /* comment is skipped */
315 1.6 rillig switch (expr) {
316 1.6 rillig }
317 1.6 rillig #define preprocessing
318 1.9 rillig (preprocessing)();
319 1.6 rillig (lsym_form_feed)();
321 1.6 rillig for (;;);
322 1.6 rillig do
323 1.6 rillig (lsym_do) = 3;
324 1.6 rillig while (0);
325 1.6 rillig if (cond);
326 1.6 rillig else
327 1.6 rillig (lsym_else)();
328 1.6 rillig do
329 1.6 rillig (lsym_do);
330 1.6 rillig while (0);
331 1.6 rillig str.(member); /* syntax error */
332 1.6 rillig L("string_prefix"); /* impossible */
333 1.6 rillig static (int)storage_class; /* syntax error */
334 1.6 rillig funcname(3);
335 1.6 rillig typedef (type_def) new_type;
336 1.7 rillig struct (keyword_struct_union_enum); /* syntax error */
337 1.6 rillig }
338 1.2 rillig //indent end
339
340 /* See t_errors.sh, test case 'compound_literal'. */
341