Clang Project

clang_source_code/test/Sema/outof-range-enum-constant-compare.c
1// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -fsyntax-only -DUNSIGNED -verify %s
2// RUN: %clang_cc1 -triple=x86_64-pc-win32 -fsyntax-only -DSIGNED -verify %s
3// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -fsyntax-only -DUNSIGNED -DSILENCE -Wno-tautological-constant-out-of-range-compare -verify %s
4// RUN: %clang_cc1 -triple=x86_64-pc-win32 -fsyntax-only -DSIGNED -DSILENCE -Wno-tautological-constant-out-of-range-compare -verify %s
5
6int main() {
7  enum A { A_a = 2 };
8  enum A a;
9
10#ifdef SILENCE
11  // expected-no-diagnostics
12#endif
13
14#ifdef UNSIGNED
15#ifndef SILENCE
16  if (a < 4294967296) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}
17    return 0;
18  if (4294967296 >= a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}
19    return 0;
20  if (a > 4294967296) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}
21    return 0;
22  if (4294967296 <= a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}
23    return 0;
24  if (a <= 4294967296) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}
25    return 0;
26  if (4294967296 > a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}
27    return 0;
28  if (a >= 4294967296) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}
29    return 0;
30  if (4294967296 < a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}
31    return 0;
32  if (a == 4294967296) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}
33    return 0;
34  if (4294967296 != a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}
35    return 0;
36  if (a != 4294967296) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}
37    return 0;
38  if (4294967296 == a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}
39    return 0;
40
41  if (a < 4294967296U) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}
42    return 0;
43  if (4294967296U >= a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}
44    return 0;
45  if (a > 4294967296U) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}
46    return 0;
47  if (4294967296U <= a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}
48    return 0;
49  if (a <= 4294967296U) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}
50    return 0;
51  if (4294967296U > a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}
52    return 0;
53  if (a >= 4294967296U) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}
54    return 0;
55  if (4294967296U < a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}
56    return 0;
57  if (a == 4294967296U) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}
58    return 0;
59  if (4294967296U != a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}
60    return 0;
61  if (a != 4294967296U) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}
62    return 0;
63  if (4294967296U == a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}
64    return 0;
65#else // SILENCE
66  if (a < 4294967296)
67    return 0;
68  if (4294967296 >= a)
69    return 0;
70  if (a > 4294967296)
71    return 0;
72  if (4294967296 <= a)
73    return 0;
74  if (a <= 4294967296)
75    return 0;
76  if (4294967296 > a)
77    return 0;
78  if (a >= 4294967296)
79    return 0;
80  if (4294967296 < a)
81    return 0;
82  if (a == 4294967296)
83    return 0;
84  if (4294967296 != a)
85    return 0;
86  if (a != 4294967296)
87    return 0;
88  if (4294967296 == a)
89    return 0;
90
91  if (a < 4294967296U)
92    return 0;
93  if (4294967296U >= a)
94    return 0;
95  if (a > 4294967296U)
96    return 0;
97  if (4294967296U <= a)
98    return 0;
99  if (a <= 4294967296U)
100    return 0;
101  if (4294967296U > a)
102    return 0;
103  if (a >= 4294967296U)
104    return 0;
105  if (4294967296U < a)
106    return 0;
107  if (a == 4294967296U)
108    return 0;
109  if (4294967296U != a)
110    return 0;
111  if (a != 4294967296U)
112    return 0;
113  if (4294967296U == a)
114    return 0;
115#endif
116#elif defined(SIGNED)
117#ifndef SILENCE
118  if (a < -2147483649) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always false}}
119    return 0;
120  if (-2147483649 >= a) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always false}}
121    return 0;
122  if (a > -2147483649) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always true}}
123    return 0;
124  if (-2147483649 <= a) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always true}}
125    return 0;
126  if (a <= -2147483649) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always false}}
127    return 0;
128  if (-2147483649 > a) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always false}}
129    return 0;
130  if (a >= -2147483649) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always true}}
131    return 0;
132  if (-2147483649 < a) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always true}}
133    return 0;
134  if (a == -2147483649) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always false}}
135    return 0;
136  if (-2147483649 != a) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always true}}
137    return 0;
138  if (a != -2147483649) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always true}}
139    return 0;
140  if (-2147483649 == a) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always false}}
141    return 0;
142
143  if (a < 2147483648) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always true}}
144    return 0;
145  if (2147483648 >= a) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always true}}
146    return 0;
147  if (a > 2147483648) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always false}}
148    return 0;
149  if (2147483648 <= a) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always false}}
150    return 0;
151  if (a <= 2147483648) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always true}}
152    return 0;
153  if (2147483648 > a) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always true}}
154    return 0;
155  if (a >= 2147483648) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always false}}
156    return 0;
157  if (2147483648 < a) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always false}}
158    return 0;
159  if (a == 2147483648) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always false}}
160    return 0;
161  if (2147483648 != a) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always true}}
162    return 0;
163  if (a != 2147483648) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always true}}
164    return 0;
165  if (2147483648 == a) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always false}}
166    return 0;
167#else // SILENCE
168  if (a < -2147483649)
169    return 0;
170  if (-2147483649 >= a)
171    return 0;
172  if (a > -2147483649)
173    return 0;
174  if (-2147483649 <= a)
175    return 0;
176  if (a <= -2147483649)
177    return 0;
178  if (-2147483649 > a)
179    return 0;
180  if (a >= -2147483649)
181    return 0;
182  if (-2147483649 < a)
183    return 0;
184  if (a == -2147483649)
185    return 0;
186  if (-2147483649 != a)
187    return 0;
188  if (a != -2147483649)
189    return 0;
190  if (-2147483649 == a)
191    return 0;
192
193  if (a < 2147483648)
194    return 0;
195  if (2147483648 >= a)
196    return 0;
197  if (a > 2147483648)
198    return 0;
199  if (2147483648 <= a)
200    return 0;
201  if (a <= 2147483648)
202    return 0;
203  if (2147483648 > a)
204    return 0;
205  if (a >= 2147483648)
206    return 0;
207  if (2147483648 < a)
208    return 0;
209  if (a == 2147483648)
210    return 0;
211  if (2147483648 != a)
212    return 0;
213  if (a != 2147483648)
214    return 0;
215  if (2147483648 == a)
216    return 0;
217#endif
218#endif
219}
220
221// https://bugs.llvm.org/show_bug.cgi?id=35009
222int PR35009() {
223  enum A { A_a = 2 };
224  enum A a;
225
226  // in C, this should not warn.
227
228  if (a < 1)
229    return 0;
230  if (1 >= a)
231    return 0;
232  if (a > 1)
233    return 0;
234  if (1 <= a)
235    return 0;
236  if (a <= 1)
237    return 0;
238  if (1 > a)
239    return 0;
240  if (a >= 1)
241    return 0;
242  if (1 < a)
243    return 0;
244  if (a == 1)
245    return 0;
246  if (1 != a)
247    return 0;
248  if (a != 1)
249    return 0;
250  if (1 == a)
251    return 0;
252
253  if (a < 1U)
254    return 0;
255  if (1U >= a)
256    return 0;
257  if (a > 1U)
258    return 0;
259  if (1U <= a)
260    return 0;
261  if (a <= 1U)
262    return 0;
263  if (1U > a)
264    return 0;
265  if (a >= 1U)
266    return 0;
267  if (1U < a)
268    return 0;
269  if (a == 1U)
270    return 0;
271  if (1U != a)
272    return 0;
273  if (a != 1U)
274    return 0;
275  if (1U == a)
276    return 0;
277
278  if (a < 2)
279    return 0;
280  if (2 >= a)
281    return 0;
282  if (a > 2)
283    return 0;
284  if (2 <= a)
285    return 0;
286  if (a <= 2)
287    return 0;
288  if (2 > a)
289    return 0;
290  if (a >= 2)
291    return 0;
292  if (2 < a)
293    return 0;
294  if (a == 2)
295    return 0;
296  if (2 != a)
297    return 0;
298  if (a != 2)
299    return 0;
300  if (2 == a)
301    return 0;
302
303  if (a < 2U)
304    return 0;
305  if (2U >= a)
306    return 0;
307  if (a > 2U)
308    return 0;
309  if (2U <= a)
310    return 0;
311  if (a <= 2U)
312    return 0;
313  if (2U > a)
314    return 0;
315  if (a >= 2U)
316    return 0;
317  if (2U < a)
318    return 0;
319  if (a == 2U)
320    return 0;
321  if (2U != a)
322    return 0;
323  if (a != 2U)
324    return 0;
325  if (2U == a)
326    return 0;
327
328  if (a < 3)
329    return 0;
330  if (3 >= a)
331    return 0;
332  if (a > 3)
333    return 0;
334  if (3 <= a)
335    return 0;
336  if (a <= 3)
337    return 0;
338  if (3 > a)
339    return 0;
340  if (a >= 3)
341    return 0;
342  if (3 < a)
343    return 0;
344  if (a == 3)
345    return 0;
346  if (3 != a)
347    return 0;
348  if (a != 3)
349    return 0;
350  if (3 == a)
351    return 0;
352
353  if (a < 3U)
354    return 0;
355  if (3U >= a)
356    return 0;
357  if (a > 3U)
358    return 0;
359  if (3U <= a)
360    return 0;
361  if (a <= 3U)
362    return 0;
363  if (3U > a)
364    return 0;
365  if (a >= 3U)
366    return 0;
367  if (3U < a)
368    return 0;
369  if (a == 3U)
370    return 0;
371  if (3U != a)
372    return 0;
373  if (a != 3U)
374    return 0;
375  if (3U == a)
376    return 0;
377
378  return 1;
379}
380