1/* Preprocessor arithmetic semantic tests.  */
2
3/* Copyright (C) 2002 Free Software Foundation, Inc.  */
4/* Source: Neil Booth, 25 May 2002.  */
5
6/* The file tests all aspects of preprocessor arithmetic that are
7   independent of target precision.  */
8
9/* { dg-do preprocess } */
10/* { dg-options "" } */
11
12/* Test || operator and its short circuiting.  */
13#if 0 || 0
14# error		/* { dg-bogus "error" }  */
15#endif
16
17#if 5 || 0
18#else
19# error		/* { dg-bogus "error" }  */
20#endif
21
22#if 0 || 1
23#else
24# error		/* { dg-bogus "error" }  */
25#endif
26
27#if 1 || 4
28#else
29# error		/* { dg-bogus "error" }  */
30#endif
31
32#if 1 || (8 / 0) /* { dg-bogus "division by zero" }  */
33#else
34# error		/* { dg-bogus "error" }  */
35#endif
36
37#if 1 || (1 << 256) /* { dg-bogus "overflow" }  */
38#endif
39
40/* Test && operator and its short circuiting.  */
41#if (0 && 0) || (0 && 1) || (1 && 0)
42# error		/* { dg-bogus "error" }  */
43#endif
44
45#if 1 && 2
46#else
47# error		/* { dg-bogus "error" }  */
48#endif
49
50#if 0 && (8 / 0)/* { dg-bogus "division by zero" }  */
51# error		/* { dg-bogus "error" }  */
52#endif
53
54#if 0 && (1 << 256) /* { dg-bogus "overflow" }  */
55#endif
56
57/* Test == and != operators, and their signedness.  */
58#if 1 == 0 || 0 == 1 || 20 != 0x014 || 142 != 0216
59# error		/* { dg-bogus "error" }  */
60#endif
61
62#if (1 == 1) - 2 > 0 || (1U != 1U) - 2 > 0
63# error		/* { dg-bogus "error" }  */
64#endif
65
66/* Test ? : operator, its short circuiting, and its signedness.  */
67#if (1 ? 3: 5) != 3 || (0 ? 3: 5) != 5
68# error		/* { dg-bogus "error" }  */
69#endif
70
71#if 1 ? 0: 1 / 0 /* { dg-bogus "division by zero" }  */
72# error		/* { dg-bogus "error" }  */
73#endif
74
75#if 0 ? 1 / 0: 0 /* { dg-bogus "division by zero" }  */
76# error		/* { dg-bogus "error" }  */
77#endif
78
79#if 0 ? (1 << 256): 0 /* { dg-bogus "overflow" }  */
80#endif
81
82#if 1 ? 0: (1 << 256) /* { dg-bogus "overflow" }  */
83#endif
84
85/* Test unary + and its signedness.  */
86
87#if 23 != +23 || 23 != + +23
88# error		/* { dg-bogus "error" }  */
89#endif
90
91#if (+1 - 2) > 0 || (+1U - 2) < 0
92# error		/* { dg-bogus "error" }  */
93#endif
94
95/* Test unary - and its signedness.  */
96
97#if -1 + 1 != 0
98# error		/* { dg-bogus "error" }  */
99#endif
100
101#if -1 >= 0 || -1U <= 0
102# error		/* { dg-bogus "error" }  */
103#endif
104
105/* Test unary ! and its signedness.  */
106#if !5 != 0 || !1 != 0 || !0 != 1
107# error		/* { dg-bogus "error" }  */
108#endif
109
110#if !5 - 1 > 0 || !5U - 1 > 0
111# error		/* { dg-bogus "error" }  */
112#endif
113
114/* Test unary ~ and its signedness.  */
115#if ~0 != -1 || ~~5 != 5 || ~-2 != 1
116# error		/* { dg-bogus "error" }  */
117#endif
118
119#if ~5 > 0 || ~5U < 0
120# error		/* { dg-bogus "error" }  */
121#endif
122
123/* Test comparison operators and their signedness.  */
124#if 1 >= 1 && 2 >= 1 && -1 >= -1 && -1 >= -2 && 1 >= -1 && 1 >= -2 \
125    && !(-2 >= -1) && !(2 >= 3) && -1U >= 2 && !(-1 >= 1)
126#else
127# error		/* { dg-bogus "error" }  */
128#endif
129
130#if ((1 > 0) - 2) > 0 || ((1U > 0) - 2) > 0
131# error		/* { dg-bogus "error" }  */
132#endif
133
134#if !(1 > 1) && 2 > 1 && !(-1 > -1) && -1 > -2 && 1 > -1 && 1 > -2 \
135    && !(-2 > -1) && !(2 > 3) && -1U > 2 && !(-1 > 1)
136#else
137# error		/* { dg-bogus "error" }  */
138#endif
139
140#if ((1 >= 0) - 2) > 0 || ((1U >= 0) - 2) > 0
141# error		/* { dg-bogus "error" }  */
142#endif
143
144#if 1 <= 1 && !(2 <= 1) && -1 <= -1 && !(-1 <= -2) && !(1 <= -1) && !(1 <= -2) \
145    && -2 <= -1 && 2 <= 3 && !(-1U <= 2) && -1 <= 1
146#else
147# error		/* { dg-bogus "error" }  */
148#endif
149
150#if ((1 <= 0) - 2) > 0 || ((1U <= 0) - 2) > 0
151# error		/* { dg-bogus "error" }  */
152#endif
153
154#if !(1 < 1) && !(2 < 1) && !(-1 < -1) && !(-1 < -2) && !(1 < -1) && !(1 < -2) \
155    && -2 < -1 && 2 < 3 && !(-1U < 2) && -1 < 1
156#else
157# error		/* { dg-bogus "error" }  */
158#endif
159
160#if ((1 < 0) - 2) > 0 || ((1U < 0) - 2) > 0
161# error		/* { dg-bogus "error" }  */
162#endif
163
164/* Test bitwise operators and their signedness.  */
165#if (3 & 7) != 3 || (-1 & 34) != 34
166# error		/* { dg-bogus "error" }  */
167#endif
168
169#if (3 & 7) - 20 > 0 || (3 & 7U) - 20 < 0
170# error		/* { dg-bogus "error" }  */
171#endif
172
173#if (3 | 5) != 7 || (-1 | 34) != -1
174# error		/* { dg-bogus "error" }  */
175#endif
176
177#if (3 | 7) - 20 > 0 || (3 | 7U) - 20 < 0
178# error		/* { dg-bogus "error" }  */
179#endif
180
181#if (7 ^ 5) != 2 || (-1 ^ 34) != ~34
182# error		/* { dg-bogus "error" }  */
183#endif
184
185#if (3 ^ 7) - 20 > 0 || (3 ^ 7U) - 20 < 0
186# error		/* { dg-bogus "error" }  */
187#endif
188
189/* Test shifts and their signedness.  */
190#if 3 << 2 != 12 || 3 << -2 != 0 || -1 << 1 != -2
191# error		/* { dg-bogus "error" }  */
192#endif
193
194#if 5 >> 1 != 2 || 5 >> -2 != 20 || -5 >> 1 != -3
195# error		/* { dg-bogus "error" }  */
196#endif
197
198#if (5 >> 2) - 2 >= 0 || (5U >> 2) - 2 <= 0
199# error		/* { dg-bogus "error" }  */
200#endif
201
202#if (5 << 1) - 20 >= 0 || (5U << 1) - 20 <= 0
203# error		/* { dg-bogus "error" }  */
204#endif
205
206#if 0
207/* Test min / max and their signedness.  */
208#if (3 >? 2) != 3 || (-3 >? -2) != -2
209# error		/* { dg-bogus "error" }  */
210#endif
211
212#if (3 <? 2) != 2 || (-3 <? -2) != -3
213# error		/* { dg-bogus "error" }  */
214#endif
215
216#if (3 >? 2) - 4 >= 0 || (3 >? 2U) - 4 <= 0
217# error		/* { dg-bogus "error" }  */
218#endif
219
220#if (3 <? 2) - 4 >= 0 || (3 <? 2U) - 4 <= 0
221# error		/* { dg-bogus "error" }  */
222#endif
223#endif
224
225/* Test *, / and % and their signedness.  */
226#if 3 * 2 != 6 || 3 * -2 != -6 || -2 * 3 != -6 || -2 * -3 != 6
227# error		/* { dg-bogus "error" }  */
228#endif
229
230#if 3 * 2 - 7 >= 0 || 3 * 2U - 7 < 0
231# error		/* { dg-bogus "error" }  */
232#endif
233
234#if 5 / 2 != 2 || -325 / 50 != -6 || 53 / -4 != -13 || -55 / -12 != 4
235# error		/* { dg-bogus "error" }  */
236#endif
237
238#if 3 / 2 - 7 >= 0 || 3 / 2U - 7 < 0
239# error		/* { dg-bogus "error" }  */
240#endif
241
242#if 5 % 2 != 1 || -325 % 50 != -25 || 53 % -4 != 1 || -55 % -12 != -7
243# error		/* { dg-bogus "error" }  */
244#endif
245
246#if 3 % 2 - 7 >= 0 || 3U % 2 - 7 < 0
247# error		/* { dg-bogus "error" }  */
248#endif
249
250/* Test , and its signedness.  */
251#if (1, 2) != 2 || (2, 1) != 1
252# error		/* { dg-bogus "error" }  */
253#endif
254
255#if (1, 2) - 3 >= 0 || (1, 2U) - 3 <= 0 || (1U, 2) - 3 >= 0
256# error		/* { dg-bogus "error" }  */
257#endif
258