xref: /netbsd-src/tests/usr.bin/indent/lsym_binary_op.c (revision 7d62b00eb9ad855ffcd7da46b41e23feb5476fac)
1 /* $NetBSD: lsym_binary_op.c,v 1.6 2022/04/24 10:36:37 rillig Exp $ */
2 
3 /*
4  * Tests for the token lsym_binary_op, which represents a binary operator in
5  * an expression.  Examples for binary operators are '>>', '=', '+', '&&'.
6  *
7  * Binary operators are surrounded by blanks.
8  *
9  * Some tokens like '+', '*' or '&' can be either binary or unary operators,
10  * with an entirely different meaning.
11  *
12  * The token '*' is not only a binary or a unary operator, it is used in types
13  * as well, to derive a pointer type.
14  *
15  * See also:
16  *	lsym_postfix_op.c	for postfix unary operators
17  *	lsym_unary_op.c		for prefix unary operators
18  *	lsym_colon.c		for ':'
19  *	lsym_question.c		for '?'
20  *	lsym_comma.c		for ','
21  *	C99 6.4.6		"Punctuators"
22  */
23 
24 //indent input
25 void
26 binary_operators(void)
27 {
28 	/* In the order of appearance in C11 6.5. */
29 	a = a * a;
30 	a = a / a;
31 	a = a % a;
32 	a = a + a;
33 	a = a - a;
34 	a = a << a;
35 	a = a >> a;
36 	a = a < a;
37 	a = a > a;
38 	a = a <= a;
39 	a = a >= a;
40 	a = a == a;
41 	a = a != a;
42 	a = a & a;
43 	a = a ^ a;
44 	a = a | a;
45 	a = a && a;
46 	a = a || a;
47 	a = a ? a : a;
48 	a = a;
49 	a *= a;
50 	a /= a;
51 	a %= a;
52 	a += a;
53 	a -= a;
54 	a <<= a;
55 	a >>= a;
56 	a &= a;
57 	a ^= a;
58 	a |= a;
59 	a = a, a;
60 }
61 //indent end
62 
63 //indent run-equals-input
64 
65 
66 /*
67  * If a '*' is immediately followed by another '*', they still form separate
68  * operators. The first is a binary operator, the second is unary.
69  */
70 //indent input
71 int var = expr**ptr;
72 //indent end
73 
74 //indent run -di0
75 int var = expr * *ptr;
76 //indent end
77 
78 
79 /*
80  * When indent tokenizes some operators, it allows for
81  * arbitrary repetitions of the operator character, followed by an
82  * arbitrary amount of '='.  This is used for operators like '&&' or
83  * '|||==='.
84  *
85  * Before 2021-03-07 22:11:01, the comment '//' was treated as an
86  * operator as well, and so was the comment '/////', leading to
87  * unexpected results.
88  *
89  * See lexi.c, lexi, "default:".
90  */
91 //indent input
92 void
93 long_run_of_operators(void)
94 {
95 	if (a &&&&&&& b)
96 		return;
97 	if (a |||=== b)
98 		return;
99 }
100 //indent end
101 
102 //indent run-equals-input
103 
104 
105 /*
106  * Long chains of '+' and '-' must be split into several operators as the
107  * lexer has to distinguish between '++' and '+' early.  The following
108  * sequence is thus tokenized as:
109  *
110  *	word		"a"
111  *	postfix_op	"++"
112  *	binary_op	"++"
113  *	unary_op	"++"
114  *	unary_op	"+"
115  *	word		"b"
116  *
117  * See lexi.c, lexi, "case '+':".
118  */
119 //indent input
120 void
121 joined_unary_and_binary_operators(void)
122 {
123 	if (a +++++++ b)
124 		return;
125 }
126 //indent end
127 
128 //indent run
129 void
130 joined_unary_and_binary_operators(void)
131 {
132 	if (a++ ++ ++ +b)
133 		return;
134 }
135 //indent end
136 
137 
138 /*
139  * Ensure that the result of the indentation does not depend on whether a
140  * token from the input starts in column 1 or 9.
141  *
142  * See process_binary_op, ps.curr_col_1.
143  */
144 //indent input
145 int col_1 //
146 = //
147 1;
148 
149 int col_9 //
150 	= //
151 	9;
152 //indent end
153 
154 //indent run
155 int		col_1		//
156 =				//
157 1;
158 
159 int		col_9		//
160 =				//
161 9;
162 //indent end
163