comparison clang/test/Sema/tautological-constant-compare.c @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents 1d019706d866
children c4bab56944e8
comparison
equal deleted inserted replaced
173:0572611fdcc8 207:2e18cbf3894f
1 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wtautological-constant-in-range-compare -DTEST -verify %s 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 -verify -x c++ %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 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 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 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 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 %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 -x c++ %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 %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 -x c++ %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 %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 -x c++ %s 12 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -verify=silent -x c++ %s
13
14 #ifndef TEST
15 // silent-no-diagnostics
16 #endif
13 17
14 int value(void); 18 int value(void);
15 19
16 #define macro(val) val 20 #define macro(val) val
17 21
182 if (-32768L > s) // expected-warning {{comparison -32768 > 'short' is always false}} 186 if (-32768L > s) // expected-warning {{comparison -32768 > 'short' is always false}}
183 return 0; 187 return 0;
184 if (-32768L >= s) 188 if (-32768L >= s)
185 return 0; 189 return 0;
186 #else 190 #else
187 // expected-no-diagnostics
188 if (s == 32767) 191 if (s == 32767)
189 return 0; 192 return 0;
190 if (s != 32767) 193 if (s != 32767)
191 return 0; 194 return 0;
192 if (s < 32767) 195 if (s < 32767)
371 if (65535UL > us) 374 if (65535UL > us)
372 return 0; 375 return 0;
373 if (65535UL >= us) // expected-warning {{comparison 65535 >= 'unsigned short' is always true}} 376 if (65535UL >= us) // expected-warning {{comparison 65535 >= 'unsigned short' is always true}}
374 return 0; 377 return 0;
375 #else 378 #else
376 // expected-no-diagnostics
377 if (us == 65535) 379 if (us == 65535)
378 return 0; 380 return 0;
379 if (us != 65535) 381 if (us != 65535)
380 return 0; 382 return 0;
381 if (us < 65535) 383 if (us < 65535)
543 if (maybe > e) 545 if (maybe > e)
544 return 0; 546 return 0;
545 if (maybe >= e) 547 if (maybe >= e)
546 return 0; 548 return 0;
547 549
548 // For the time being, use the declared type of bit-fields rather than their 550 // We only warn on out-of-range bitfields and expressions with limited range
549 // length when determining whether a value is in-range. 551 // under -Wtantological-in-range-compare, not under -Wtype-limits, because
550 // FIXME: Reconsider this. 552 // the warning is not based on the type alone.
551 struct A { 553 struct A {
552 int a : 3; 554 int a : 3;
553 unsigned b : 3; 555 unsigned b : 3;
554 long c : 3; 556 long c : 3;
555 unsigned long d : 3; 557 unsigned long d : 3;
556 } a; 558 } a;
557 if (a.a < 3) {} 559 if (a.a < 3) {}
558 if (a.a < 4) {} 560 if (a.a < 4) {} // #bitfield1
559 if (a.b < 7) {} 561 if (a.b < 7) {}
560 if (a.b < 8) {} 562 if (a.b < 8) {} // #bitfield2
561 if (a.c < 3) {} 563 if (a.c < 3) {}
562 if (a.c < 4) {} 564 if (a.c < 4) {} // #bitfield3
563 if (a.d < 7) {} 565 if (a.d < 7) {}
564 if (a.d < 8) {} 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
573
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
587
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
597
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}}
604
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
612
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
618
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
624
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
630
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
645
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
653
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
664
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) {}
565 670
566 return 1; 671 return 1;
567 } 672 }