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