1 1.20 rillig /* $NetBSD: lsym_lparen_or_lbracket.c,v 1.20 2025/01/03 23:37:18 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.7 rillig //indent input 148 1.6 rillig int zero = (((((((((((((((((((0))))))))))))))))))); 149 1.17 rillig int many = ((((((((((((((((((((((((((((((((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.16 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.18 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.20 rillig (lsym_form_feed)(); 321 1.6 rillig for (;;) 322 1.6 rillig ; 323 1.6 rillig do 324 1.20 rillig (lsym_do) = 3; 325 1.20 rillig while (0); 326 1.6 rillig if (cond) 327 1.6 rillig ; 328 1.6 rillig else 329 1.6 rillig (lsym_else)(); 330 1.6 rillig do 331 1.6 rillig (lsym_do); 332 1.6 rillig while (0); 333 1.6 rillig str.(member); /* syntax error */ 334 1.6 rillig L("string_prefix"); /* impossible */ 335 1.6 rillig static (int)storage_class; /* syntax error */ 336 1.6 rillig funcname(3); 337 1.6 rillig typedef (type_def) new_type; 338 1.7 rillig struct (keyword_struct_union_enum); /* syntax error */ 339 1.6 rillig } 340 1.2 rillig //indent end 341 1.14 rillig 342 1.14 rillig /* See t_errors.sh, test case 'compound_literal'. */ 343 1.15 rillig 344 1.15 rillig 345 1.15 rillig /* 346 1.15 rillig * Ensure that a designated initializer after a comma is not indented further 347 1.14 rillig * than necessary, as in most other contexts, there is no space before a '['. 348 1.14 rillig */ 349 1.14 rillig //indent input 350 1.14 rillig int arr[] = { 351 1.14 rillig ['0'] = 1, 352 1.14 rillig ['1'] = 2, 353 1.14 rillig }; 354 1.14 rillig //indent end 355 1.14 rillig 356 1.14 rillig //indent run -di0 357 1.15 rillig int arr[] = { 358 1.14 rillig ['0'] = 1, 359 1.14 rillig ['1'] = 2, 360 1.19 rillig }; 361 1.19 rillig //indent end 362 1.19 rillig 363 1.19 rillig 364 1.19 rillig /* In an initializer, a '(' does not start a function definition. */ 365 1.19 rillig //indent input 366 1.19 rillig { 367 1.19 rillig type var = { 368 1.19 rillig .CONCAT(a, b) 369 1.19 rillig = init, 370 1.19 rillig }; 371 1.19 rillig } 372 1.19 rillig 373 1.19 rillig //indent end 374 1.19 rillig 375 1.19 rillig //indent run 376 1.19 rillig { 377 1.19 rillig type var = { 378 1.19 rillig .CONCAT(a, b) 379 1.19 rillig = init, 380 1.19 rillig }; 381 } 382 //indent end 383