lsym_lparen_or_lbracket.c revision 1.9 1 1.9 rillig /* $NetBSD: lsym_lparen_or_lbracket.c,v 1.9 2023/05/16 11:32:02 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.6 rillig origin = (struct point){
198 1.6 rillig 0, 0
199 1.6 rillig };
200 1.6 rillig
201 1.6 rillig /* GCC statement expression */
202 1.6 rillig /* expr = ({if(expr)debug();expr;}); */
203 1.6 rillig }
204 1.7 rillig //indent end
205 1.6 rillig
206 1.6 rillig
207 1.6 rillig /*
208 1.6 rillig * C99 designator initializers are the rare situation where there is a space
209 1.6 rillig * before a '['.
210 1.6 rillig */
211 1.7 rillig //indent input
212 1.6 rillig int array[] = {
213 1.6 rillig 1, 2, [2] = 3, [3] = 4,
214 1.6 rillig };
215 1.7 rillig //indent end
216 1.6 rillig
217 1.7 rillig //indent run-equals-input -di0
218 1.6 rillig
219 1.6 rillig
220 1.6 rillig /*
221 1.6 rillig * Test want_blank_before_lparen for all possible token types.
222 1.6 rillig */
223 1.7 rillig //indent input
224 1.6 rillig void cover_want_blank_before_lparen(void)
225 1.6 rillig {
226 1.6 rillig /* ps.prev_token can never be 'newline'. */
227 1.6 rillig int newline =
228 1.6 rillig (3);
229 1.6 rillig
230 1.6 rillig int lparen_or_lbracket = a[(3)];
231 1.6 rillig int rparen_or_rbracket = a[3](5);
232 1.6 rillig +(unary_op);
233 1.6 rillig 3 + (binary_op);
234 1.6 rillig a++(postfix_op); /* unlikely to be seen in practice */
235 1.6 rillig cond ? (question) : (5);
236 1.6 rillig switch (expr) {
237 1.6 rillig case (case_label):;
238 1.6 rillig }
239 1.6 rillig a ? 3 : (colon);
240 1.6 rillig (semicolon) = 3;
241 1.6 rillig int lbrace[] = {(3)};
242 1.6 rillig int rbrace_in_decl = {{3}(4)}; /* syntax error */
243 1.6 rillig {}
244 1.6 rillig (rbrace_in_stmt)();
245 1.6 rillig ident(3);
246 1.6 rillig int(decl);
247 1.6 rillig a++, (comma)();
248 1.6 rillig int comment = /* comment */ (3); /* comment is skipped */
249 1.6 rillig switch (expr) {}
250 1.6 rillig #define preprocessing
251 1.6 rillig (preprocessing)();
252 1.9 rillig (lsym_form_feed)();
254 1.6 rillig for(;;);
255 1.6 rillig do(lsym_do)=3;while(0);
256 1.6 rillig if(cond);else(lsym_else)();
257 1.6 rillig do(lsym_do);while(0);
258 1.6 rillig str.(member); /* syntax error */
259 1.6 rillig L("string_prefix"); /* impossible */
260 1.6 rillig static (int)storage_class; /* syntax error */
261 1.6 rillig funcname(3);
262 1.6 rillig typedef (type_def) new_type;
263 1.6 rillig // $ TODO: is keyword_struct_union_enum possible?
264 1.6 rillig struct (keyword_struct_union_enum); /* syntax error */
265 1.7 rillig }
266 1.6 rillig //indent end
267 1.7 rillig
268 1.6 rillig //indent run -ldi0
269 1.6 rillig void
270 1.6 rillig cover_want_blank_before_lparen(void)
271 1.6 rillig {
272 1.6 rillig /* ps.prev_token can never be 'newline'. */
273 1.6 rillig int newline =
274 1.6 rillig (3);
275 1.6 rillig
276 1.6 rillig int lparen_or_lbracket = a[(3)];
277 1.6 rillig int rparen_or_rbracket = a[3](5);
278 1.6 rillig +(unary_op);
279 1.6 rillig 3 + (binary_op);
280 1.6 rillig a++ (postfix_op); /* unlikely to be seen in practice */
281 1.6 rillig cond ? (question) : (5);
282 1.6 rillig switch (expr) {
283 1.6 rillig case (case_label):;
284 1.6 rillig }
285 1.6 rillig a ? 3 : (colon);
286 1.6 rillig (semicolon) = 3;
287 1.6 rillig int lbrace[] = {(3)};
288 1.6 rillig int rbrace_in_decl = {{3} (4)}; /* syntax error */
289 1.6 rillig {
290 1.6 rillig }
291 1.6 rillig (rbrace_in_stmt)();
292 1.6 rillig ident(3);
293 1.6 rillig int (decl);
294 1.6 rillig a++, (comma)();
295 1.6 rillig int comment = /* comment */ (3); /* comment is skipped */
296 1.6 rillig switch (expr) {
297 1.6 rillig }
298 1.6 rillig #define preprocessing
299 1.9 rillig (preprocessing)();
300 1.6 rillig (lsym_form_feed)();
302 1.6 rillig for (;;);
303 1.6 rillig do
304 1.6 rillig (lsym_do) = 3;
305 1.6 rillig while (0);
306 1.6 rillig if (cond);
307 1.6 rillig else
308 1.6 rillig (lsym_else)();
309 1.6 rillig do
310 1.6 rillig (lsym_do);
311 1.6 rillig while (0);
312 1.6 rillig str.(member); /* syntax error */
313 1.6 rillig L("string_prefix"); /* impossible */
314 1.6 rillig static (int)storage_class; /* syntax error */
315 1.6 rillig funcname(3);
316 1.6 rillig typedef (type_def) new_type;
317 1.7 rillig struct (keyword_struct_union_enum); /* syntax error */
318 1.6 rillig }
319 1.2 rillig //indent end
320
321 /* See t_errors.sh, test case 'compound_literal'. */
322