lsym_lparen_or_lbracket.c revision 1.5 1 1.5 rillig /* $NetBSD: lsym_lparen_or_lbracket.c,v 1.5 2022/04/23 17:25:58 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.1 rillig * In an expression, an identifier followed by '(' starts a function call
13 1.1 rillig * expression.
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.1 rillig * After one of the keywords 'for', 'if', 'switch' or 'while', the controlling
18 1.5 rillig * expression must be enclosed in '(' and ')'; see lsym_for.c, lsym_if.c,
19 1.5 rillig * lsym_switch.c, lsym_while.c.
20 1.1 rillig *
21 1.5 rillig * In an expression, '(' followed by a type name starts a cast expression or
22 1.5 rillig * a compound literal.
23 1.5 rillig *
24 1.5 rillig * In a declaration, '[' derives an array type.
25 1.5 rillig *
26 1.5 rillig * In an expression, '[' starts an array subscript.
27 1.5 rillig */
28 1.5 rillig
29 1.5 rillig /* The '(' in a type name derives a function type. */
30 1.5 rillig #indent input
31 1.5 rillig typedef void signal_handler(int);
32 1.5 rillig void (*signal(void (*)(int)))(int);
33 1.5 rillig #indent end
34 1.5 rillig
35 1.5 rillig #indent run
36 1.5 rillig typedef void signal_handler(int);
37 1.5 rillig void (*signal(void (*)(int)))(int);
38 1.5 rillig #indent end
39 1.5 rillig
40 1.5 rillig
41 1.5 rillig /*
42 1.5 rillig * The '(' in an expression overrides operator precedence. In multi-line
43 1.5 rillig * expressions, the continuation lines are aligned on the parentheses.
44 1.1 rillig */
45 1.5 rillig #indent input
46 1.5 rillig int nested = (
47 1.5 rillig (
48 1.5 rillig (
49 1.5 rillig (
50 1.5 rillig 1 + 4
51 1.5 rillig )
52 1.5 rillig )
53 1.5 rillig )
54 1.5 rillig );
55 1.5 rillig #indent end
56 1.5 rillig
57 1.5 rillig #indent run
58 1.5 rillig int nested = (
59 1.5 rillig (
60 1.5 rillig (
61 1.5 rillig (
62 1.5 rillig 1 + 4
63 1.5 rillig )
64 1.5 rillig )
65 1.5 rillig )
66 1.5 rillig );
67 1.5 rillig #indent end
68 1.5 rillig
69 1.5 rillig
70 1.5 rillig /* The '(' in a function call expression starts the argument list. */
71 1.5 rillig #indent input
72 1.5 rillig int var = macro_call ( arg1, arg2 ,arg3);
73 1.5 rillig #indent end
74 1.5 rillig
75 1.5 rillig #indent run
76 1.5 rillig int var = macro_call(arg1, arg2, arg3);
77 1.5 rillig #indent end
78 1.5 rillig
79 1.5 rillig
80 1.5 rillig /*
81 1.5 rillig * The '(' in a sizeof expression is required for type names and optional for
82 1.5 rillig * expressions.
83 1.5 rillig */
84 1.5 rillig #indent input
85 1.5 rillig size_t sizeof_typename = sizeof ( int );
86 1.5 rillig size_t sizeof_expr = sizeof ( 12345 ) ;
87 1.5 rillig #indent end
88 1.5 rillig
89 1.5 rillig #indent run
90 1.5 rillig size_t sizeof_typename = sizeof(int);
91 1.5 rillig size_t sizeof_expr = sizeof(12345);
92 1.5 rillig #indent end
93 1.5 rillig
94 1.5 rillig
95 1.5 rillig /* The '[' in a type name derives an array type. */
96 1.5 rillig #indent input
97 1.5 rillig int array_of_numbers[100];
98 1.5 rillig #indent end
99 1.5 rillig
100 1.5 rillig #indent run
101 1.5 rillig int array_of_numbers[100];
102 1.5 rillig #indent end
103 1.5 rillig
104 1.5 rillig
105 1.5 rillig /* The '[' in an expression accesses an array element. */
106 1.5 rillig #indent input
107 1.5 rillig int second_prime = &primes[1];
108 1.5 rillig #indent end
109 1.5 rillig
110 1.5 rillig #indent run
111 1.5 rillig int second_prime = &primes[1];
112 1.5 rillig #indent end
113 1.1 rillig
114 1.3 rillig
115 1.1 rillig #indent input
116 1.3 rillig void
117 1.3 rillig function(void)
118 1.3 rillig {
119 1.3 rillig /* Type casts */
120 1.3 rillig a = (int)b;
121 1.3 rillig a = (struct tag)b;
122 1.3 rillig /* TODO: The '(int)' is not a type cast, it is a prototype list. */
123 1.3 rillig a = (int (*)(int))fn;
124 1.3 rillig
125 1.3 rillig /* Not type casts */
126 1.3 rillig a = sizeof(int) * 2;
127 1.3 rillig a = sizeof(5) * 2;
128 1.3 rillig a = offsetof(struct stat, st_mtime);
129 1.3 rillig
130 1.3 rillig /* Grouping subexpressions */
131 1.3 rillig a = ((((b + c)))) * d;
132 1.3 rillig }
133 1.1 rillig #indent end
134 1.1 rillig
135 1.1 rillig #indent run-equals-input
136 1.2 rillig
137 1.2 rillig /* See t_errors.sh, test case 'compound_literal'. */
138