[docs] Add LICENSE.txt to the root of the mono-repo
[llvm-project.git] / clang / test / Sema / tautological-constant-compare.c
blob04b8a1416be0b0c40a6c59f87a660d15623a8144
1 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wtautological-constant-in-range-compare -DTEST=2 -verify %s
2 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wtautological-constant-in-range-compare -DTEST=2 -verify -x c++ %s
3 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wtautological-type-limit-compare -DTEST -verify %s
4 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wtautological-type-limit-compare -DTEST -verify -x c++ %s
5 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wtype-limits -DTEST -verify %s
6 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wtype-limits -DTEST -verify -x c++ %s
7 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wextra -Wno-sign-compare -verify=silent %s
8 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wextra -Wno-sign-compare -verify=silent -x c++ %s
9 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wall -verify=silent %s
10 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wall -verify=silent -x c++ %s
11 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -verify=silent %s
12 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -verify=silent -x c++ %s
14 #ifndef TEST
15 // silent-no-diagnostics
16 #endif
18 int value(void);
20 #define macro(val) val
22 #ifdef __cplusplus
23 template<typename T>
24 void TFunc() {
25 // Make sure that we do warn for normal variables in template functions !
26 unsigned char c = value();
27 #ifdef TEST
28 if (c > 255) // expected-warning {{comparison 'unsigned char' > 255 is always false}}
29 return;
30 #else
31 if (c > 255)
32 return;
33 #endif
35 if (c > macro(255))
36 return;
38 T v = value();
39 if (v > 255)
40 return;
41 if (v > 32767)
42 return;
44 #endif
46 int main(void)
48 #ifdef __cplusplus
49 TFunc<unsigned char>();
50 TFunc<signed short>();
51 #endif
53 short s = value();
55 #ifdef TEST
56 if (s == 32767)
57 return 0;
58 if (s != 32767)
59 return 0;
60 if (s < 32767)
61 return 0;
62 if (s <= 32767) // expected-warning {{comparison 'short' <= 32767 is always true}}
63 return 0;
64 if (s > 32767) // expected-warning {{comparison 'short' > 32767 is always false}}
65 return 0;
66 if (s >= 32767)
67 return 0;
69 if (32767 == s)
70 return 0;
71 if (32767 != s)
72 return 0;
73 if (32767 < s) // expected-warning {{comparison 32767 < 'short' is always false}}
74 return 0;
75 if (32767 <= s)
76 return 0;
77 if (32767 > s)
78 return 0;
79 if (32767 >= s) // expected-warning {{comparison 32767 >= 'short' is always true}}
80 return 0;
82 // FIXME: assumes two's complement
83 if (s == -32768)
84 return 0;
85 if (s != -32768)
86 return 0;
87 if (s < -32768) // expected-warning {{comparison 'short' < -32768 is always false}}
88 return 0;
89 if (s <= -32768)
90 return 0;
91 if (s > -32768)
92 return 0;
93 if (s >= -32768) // expected-warning {{comparison 'short' >= -32768 is always true}}
94 return 0;
96 if (-32768 == s)
97 return 0;
98 if (-32768 != s)
99 return 0;
100 if (-32768 < s)
101 return 0;
102 if (-32768 <= s) // expected-warning {{comparison -32768 <= 'short' is always true}}
103 return 0;
104 if (-32768 > s) // expected-warning {{comparison -32768 > 'short' is always false}}
105 return 0;
106 if (-32768 >= s)
107 return 0;
109 // Note: both sides are promoted to unsigned long prior to the comparison, so
110 // it is perfectly possible for a short to compare greater than 32767UL.
111 if (s == 32767UL)
112 return 0;
113 if (s != 32767UL)
114 return 0;
115 if (s < 32767UL)
116 return 0;
117 if (s <= 32767UL)
118 return 0;
119 if (s > 32767UL)
120 return 0;
121 if (s >= 32767UL)
122 return 0;
124 if (32767UL == s)
125 return 0;
126 if (32767UL != s)
127 return 0;
128 if (32767UL < s)
129 return 0;
130 if (32767UL <= s)
131 return 0;
132 if (32767UL > s)
133 return 0;
134 if (32767UL >= s)
135 return 0;
137 enum { ULONG_MAX = (2UL * (unsigned long)__LONG_MAX__ + 1UL) };
138 if (s == 2UL * (unsigned long)__LONG_MAX__ + 1UL)
139 return 0;
140 if (s != 2UL * (unsigned long)__LONG_MAX__ + 1UL)
141 return 0;
142 if (s < 2UL * (unsigned long)__LONG_MAX__ + 1UL)
143 return 0;
144 if (s <= 2UL * (unsigned long)__LONG_MAX__ + 1UL) // expected-warning-re {{comparison 'short' <= {{.*}} is always true}}
145 return 0;
146 if (s > 2UL * (unsigned long)__LONG_MAX__ + 1UL) // expected-warning-re {{comparison 'short' > {{.*}} is always false}}
147 return 0;
148 if (s >= 2UL * (unsigned long)__LONG_MAX__ + 1UL)
149 return 0;
151 if (2UL * (unsigned long)__LONG_MAX__ + 1UL == s)
152 return 0;
153 if (2UL * (unsigned long)__LONG_MAX__ + 1UL != s)
154 return 0;
155 if (2UL * (unsigned long)__LONG_MAX__ + 1UL < s) // expected-warning-re {{comparison {{.*}} < 'short' is always false}}
156 return 0;
157 if (2UL * (unsigned long)__LONG_MAX__ + 1UL <= s)
158 return 0;
159 if (2UL * (unsigned long)__LONG_MAX__ + 1UL > s)
160 return 0;
161 if (2UL * (unsigned long)__LONG_MAX__ + 1UL >= s) // expected-warning-re {{comparison {{.*}} >= 'short' is always true}}
162 return 0;
164 // FIXME: assumes two's complement
165 if (s == -32768L)
166 return 0;
167 if (s != -32768L)
168 return 0;
169 if (s < -32768L) // expected-warning {{comparison 'short' < -32768 is always false}}
170 return 0;
171 if (s <= -32768L)
172 return 0;
173 if (s > -32768L)
174 return 0;
175 if (s >= -32768L) // expected-warning {{comparison 'short' >= -32768 is always true}}
176 return 0;
178 if (-32768L == s)
179 return 0;
180 if (-32768L != s)
181 return 0;
182 if (-32768L < s)
183 return 0;
184 if (-32768L <= s) // expected-warning {{comparison -32768 <= 'short' is always true}}
185 return 0;
186 if (-32768L > s) // expected-warning {{comparison -32768 > 'short' is always false}}
187 return 0;
188 if (-32768L >= s)
189 return 0;
190 #else
191 if (s == 32767)
192 return 0;
193 if (s != 32767)
194 return 0;
195 if (s < 32767)
196 return 0;
197 if (s <= 32767)
198 return 0;
199 if (s > 32767)
200 return 0;
201 if (s >= 32767)
202 return 0;
204 if (32767 == s)
205 return 0;
206 if (32767 != s)
207 return 0;
208 if (32767 < s)
209 return 0;
210 if (32767 <= s)
211 return 0;
212 if (32767 > s)
213 return 0;
214 if (32767 >= s)
215 return 0;
217 // FIXME: assumes two's complement
218 if (s == -32768)
219 return 0;
220 if (s != -32768)
221 return 0;
222 if (s < -32768)
223 return 0;
224 if (s <= -32768)
225 return 0;
226 if (s > -32768)
227 return 0;
228 if (s >= -32768)
229 return 0;
231 if (-32768 == s)
232 return 0;
233 if (-32768 != s)
234 return 0;
235 if (-32768 < s)
236 return 0;
237 if (-32768 <= s)
238 return 0;
239 if (-32768 > s)
240 return 0;
241 if (-32768 >= s)
242 return 0;
244 if (s == 32767UL)
245 return 0;
246 if (s != 32767UL)
247 return 0;
248 if (s < 32767UL)
249 return 0;
250 if (s <= 32767UL)
251 return 0;
252 if (s > 32767UL)
253 return 0;
254 if (s >= 32767UL)
255 return 0;
257 if (32767UL == s)
258 return 0;
259 if (32767UL != s)
260 return 0;
261 if (32767UL < s)
262 return 0;
263 if (32767UL <= s)
264 return 0;
265 if (32767UL > s)
266 return 0;
267 if (32767UL >= s)
268 return 0;
270 // FIXME: assumes two's complement
271 if (s == -32768L)
272 return 0;
273 if (s != -32768L)
274 return 0;
275 if (s < -32768L)
276 return 0;
277 if (s <= -32768L)
278 return 0;
279 if (s > -32768L)
280 return 0;
281 if (s >= -32768L)
282 return 0;
284 if (-32768L == s)
285 return 0;
286 if (-32768L != s)
287 return 0;
288 if (-32768L < s)
289 return 0;
290 if (-32768L <= s)
291 return 0;
292 if (-32768L > s)
293 return 0;
294 if (-32768L >= s)
295 return 0;
296 #endif
298 if (s == 0)
299 return 0;
300 if (s != 0)
301 return 0;
302 if (s < 0)
303 return 0;
304 if (s <= 0)
305 return 0;
306 if (s > 0)
307 return 0;
308 if (s >= 0)
309 return 0;
311 if (0 == s)
312 return 0;
313 if (0 != s)
314 return 0;
315 if (0 < s)
316 return 0;
317 if (0 <= s)
318 return 0;
319 if (0 > s)
320 return 0;
321 if (0 >= s)
322 return 0;
324 unsigned short us = value();
326 #ifdef TEST
327 if (us == 65535)
328 return 0;
329 if (us != 65535)
330 return 0;
331 if (us < 65535)
332 return 0;
333 if (us <= 65535) // expected-warning {{comparison 'unsigned short' <= 65535 is always true}}
334 return 0;
335 if (us > 65535) // expected-warning {{comparison 'unsigned short' > 65535 is always false}}
336 return 0;
337 if (us >= 65535)
338 return 0;
340 if (65535 == us)
341 return 0;
342 if (65535 != us)
343 return 0;
344 if (65535 < us) // expected-warning {{comparison 65535 < 'unsigned short' is always false}}
345 return 0;
346 if (65535 <= us)
347 return 0;
348 if (65535 > us)
349 return 0;
350 if (65535 >= us) // expected-warning {{comparison 65535 >= 'unsigned short' is always true}}
351 return 0;
353 if (us == 65535UL)
354 return 0;
355 if (us != 65535UL)
356 return 0;
357 if (us < 65535UL)
358 return 0;
359 if (us <= 65535UL) // expected-warning {{comparison 'unsigned short' <= 65535 is always true}}
360 return 0;
361 if (us > 65535UL) // expected-warning {{comparison 'unsigned short' > 65535 is always false}}
362 return 0;
363 if (us >= 65535UL)
364 return 0;
366 if (65535UL == us)
367 return 0;
368 if (65535UL != us)
369 return 0;
370 if (65535UL < us) // expected-warning {{comparison 65535 < 'unsigned short' is always false}}
371 return 0;
372 if (65535UL <= us)
373 return 0;
374 if (65535UL > us)
375 return 0;
376 if (65535UL >= us) // expected-warning {{comparison 65535 >= 'unsigned short' is always true}}
377 return 0;
378 #else
379 if (us == 65535)
380 return 0;
381 if (us != 65535)
382 return 0;
383 if (us < 65535)
384 return 0;
385 if (us <= 65535)
386 return 0;
387 if (us > 65535)
388 return 0;
389 if (us >= 65535)
390 return 0;
392 if (65535 == us)
393 return 0;
394 if (65535 != us)
395 return 0;
396 if (65535 < us)
397 return 0;
398 if (65535 <= us)
399 return 0;
400 if (65535 > us)
401 return 0;
402 if (65535 >= us)
403 return 0;
405 if (us == 65535UL)
406 return 0;
407 if (us != 65535UL)
408 return 0;
409 if (us < 65535UL)
410 return 0;
411 if (us <= 65535UL)
412 return 0;
413 if (us > 65535UL)
414 return 0;
415 if (us >= 65535UL)
416 return 0;
418 if (65535UL == us)
419 return 0;
420 if (65535UL != us)
421 return 0;
422 if (65535UL < us)
423 return 0;
424 if (65535UL <= us)
425 return 0;
426 if (65535UL > us)
427 return 0;
428 if (65535UL >= us)
429 return 0;
430 #endif
432 if (us == 32767)
433 return 0;
434 if (us != 32767)
435 return 0;
436 if (us < 32767)
437 return 0;
438 if (us <= 32767)
439 return 0;
440 if (us > 32767)
441 return 0;
442 if (us >= 32767)
443 return 0;
445 if (32767 == us)
446 return 0;
447 if (32767 != us)
448 return 0;
449 if (32767 < us)
450 return 0;
451 if (32767 <= us)
452 return 0;
453 if (32767 > us)
454 return 0;
455 if (32767 >= us)
456 return 0;
458 if (us == 32767UL)
459 return 0;
460 if (us != 32767UL)
461 return 0;
462 if (us < 32767UL)
463 return 0;
464 if (us <= 32767UL)
465 return 0;
466 if (us > 32767UL)
467 return 0;
468 if (us >= 32767UL)
469 return 0;
471 if (32767UL == us)
472 return 0;
473 if (32767UL != us)
474 return 0;
475 if (32767UL < us)
476 return 0;
477 if (32767UL <= us)
478 return 0;
479 if (32767UL > us)
480 return 0;
481 if (32767UL >= us)
482 return 0;
484 #if __SIZEOF_INT128__
485 __int128 i128 = value();
486 if (i128 == -1) // used to crash
487 return 0;
488 #endif
491 enum E {
492 yes,
494 maybe
496 enum E e = (enum E)value();
498 if (e == yes)
499 return 0;
500 if (e != yes)
501 return 0;
502 if (e < yes)
503 return 0;
504 if (e <= yes)
505 return 0;
506 if (e > yes)
507 return 0;
508 if (e >= yes)
509 return 0;
511 if (yes == e)
512 return 0;
513 if (yes != e)
514 return 0;
515 if (yes < e)
516 return 0;
517 if (yes <= e)
518 return 0;
519 if (yes > e)
520 return 0;
521 if (yes >= e)
522 return 0;
524 if (e == maybe)
525 return 0;
526 if (e != maybe)
527 return 0;
528 if (e < maybe)
529 return 0;
530 if (e <= maybe)
531 return 0;
532 if (e > maybe)
533 return 0;
534 if (e >= maybe)
535 return 0;
537 if (maybe == e)
538 return 0;
539 if (maybe != e)
540 return 0;
541 if (maybe < e)
542 return 0;
543 if (maybe <= e)
544 return 0;
545 if (maybe > e)
546 return 0;
547 if (maybe >= e)
548 return 0;
550 // We only warn on out-of-range bitfields and expressions with limited range
551 // under -Wtantological-in-range-compare, not under -Wtype-limits, because
552 // the warning is not based on the type alone.
553 struct A {
554 int a : 3;
555 unsigned b : 3;
556 long c : 3;
557 unsigned long d : 3;
558 } a;
559 if (a.a < 3) {}
560 if (a.a < 4) {} // #bitfield1
561 if (a.b < 7) {}
562 if (a.b < 8) {} // #bitfield2
563 if (a.c < 3) {}
564 if (a.c < 4) {} // #bitfield3
565 if (a.d < 7) {}
566 if (a.d < 8) {} // #bitfield4
567 #if TEST == 2
568 // expected-warning@#bitfield1 {{comparison of 3-bit signed value < 4 is always true}}
569 // expected-warning@#bitfield2 {{comparison of 3-bit unsigned value < 8 is always true}}
570 // expected-warning@#bitfield3 {{comparison of 3-bit signed value < 4 is always true}}
571 // expected-warning@#bitfield4 {{comparison of 3-bit unsigned value < 8 is always true}}
572 #endif
574 if ((s & 0xff) < 0) {} // #valuerange1
575 if ((s & 0xff) < 1) {}
576 if ((s & -3) < -4) {}
577 if ((s & -3) < -3) {}
578 if ((s & -3) < 4u) {}
579 if ((s & -3) > 4u) {}
580 if ((s & -3) == 4u) {}
581 if ((s & -3) == 3u) {} // FIXME: Impossible.
582 if ((s & -3) == -5u) {}
583 if ((s & -3) == -4u) {}
584 #if TEST == 2
585 // expected-warning@#valuerange1 {{comparison of 8-bit unsigned value < 0 is always false}}
586 #endif
588 // FIXME: Our bit-level width tracking comes unstuck here: the second of the
589 // conditions below is also tautological, but we can't tell that because we
590 // don't track the actual range, only the bit-width.
591 if ((s ? 1 : 0) + (us ? 1 : 0) > 1) {}
592 if ((s ? 1 : 0) + (us ? 1 : 0) > 2) {}
593 if ((s ? 1 : 0) + (us ? 1 : 0) > 3) {} // #addrange1
594 #if TEST == 2
595 // expected-warning@#addrange1 {{comparison of 2-bit unsigned value > 3 is always false}}
596 #endif
598 // FIXME: The second and third comparisons are also tautological; 0x40000000
599 // is the greatest value that multiplying two int16s can produce.
600 if (s * s > 0x3fffffff) {}
601 if (s * s > 0x40000000) {}
602 if (s * s > 0x7ffffffe) {}
603 if (s * s > 0x7fffffff) {} // expected-warning {{result of comparison 'int' > 2147483647 is always false}}
605 if ((s & 0x3ff) * (s & 0x1f) > 0x7be0) {}
606 if ((s & 0x3ff) * (s & 0x1f) > 0x7be1) {} // FIXME
607 if ((s & 0x3ff) * (s & 0x1f) > 0x7ffe) {} // FIXME
608 if ((s & 0x3ff) * (s & 0x1f) > 0x7fff) {} // #mulrange1
609 #if TEST == 2
610 // expected-warning@#mulrange1 {{comparison of 15-bit unsigned value > 32767 is always false}}
611 #endif
613 if (a.a * a.b > 21) {} // FIXME
614 if (a.a * a.b > 31) {} // #mulrange2
615 #if TEST == 2
616 // expected-warning@#mulrange2 {{comparison of 6-bit signed value > 31 is always false}}
617 #endif
619 if (a.a - (s & 1) < -4) {}
620 if (a.a - (s & 1) < -7) {} // FIXME
621 if (a.a - (s & 1) < -8) {} // #subrange1
622 if (a.a - (s & 1) > 3) {} // FIXME: Can be < -4 but not > 3.
623 if (a.a - (s & 1) > 7) {} // #subrange2
625 if (a.a - (s & 7) < -8) {}
626 if (a.a - (s & 7) > 7) {} // FIXME: Can be < -8 but not > 7.
627 if (a.a - (s & 7) < -15) {}
628 if (a.a - (s & 7) < -16) {} // #subrange3
629 if (a.a - (s & 7) > 15) {} // #subrange4
631 if (a.b - (s & 1) > 6) {}
632 if (a.b - (s & 1) > 7) {} // #subrange5
633 if (a.b - (s & 7) < -8) {} // #subrange6
634 if (a.b - (s & 15) < -8) {}
635 if (a.b - (s & 15) < -16) {} // #subrange7
636 #if TEST == 2
637 // expected-warning@#subrange1 {{comparison of 4-bit signed value < -8 is always false}}
638 // expected-warning@#subrange2 {{comparison of 4-bit signed value > 7 is always false}}
639 // expected-warning@#subrange3 {{comparison of 5-bit signed value < -16 is always false}}
640 // expected-warning@#subrange4 {{comparison of 5-bit signed value > 15 is always false}}
641 // expected-warning@#subrange5 {{comparison of 4-bit signed value > 7 is always false}}
642 // expected-warning@#subrange6 {{comparison of 4-bit signed value < -8 is always false}}
643 // expected-warning@#subrange7 {{comparison of 5-bit signed value < -16 is always false}}
644 #endif
646 // a.a % 3 is in range [-2, 2], which we expand to [-4, 4)
647 if (a.a % 3 > 2) {}
648 if (a.a % 3 > 3) {} // #remrange1
649 if (a.a % 3 == -1) {}
650 if (a.a % 3 == -2) {}
651 if (a.a % 3 < -3) {} // FIXME
652 if (a.a % 3 < -4) {} // #remrange2
654 // a.b % 3 is in range [0, 3), which we expand to [0, 4)
655 if (a.b % 3 > 2) {}
656 if (a.b % 3 > 3) {} // #remrange3
657 if (a.b % 3 < 0) {} // #remrange4
658 #if TEST == 2
659 // expected-warning@#remrange1 {{comparison of 3-bit signed value > 3 is always false}}
660 // expected-warning@#remrange2 {{comparison of 3-bit signed value < -4 is always false}}
661 // expected-warning@#remrange3 {{comparison of 2-bit unsigned value > 3 is always false}}
662 // expected-warning@#remrange4 {{comparison of 2-bit unsigned value < 0 is always false}}
663 #endif
665 // Don't warn on non-constant-expression values that end up being a constant
666 // 0; we generally only want to warn when one side of the comparison is
667 // effectively non-constant.
668 if ("x"[1] == 0) {}
669 if (((void)s, 0) == 0) {}
671 return 1;