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
15 // silent-no-diagnostics
20 #define macro(val) val
25 // Make sure that we do warn for normal variables in template functions !
26 unsigned char c
= value();
28 if (c
> 255) // expected-warning {{comparison 'unsigned char' > 255 is always false}}
49 TFunc
<unsigned char>();
50 TFunc
<signed short>();
62 if (s
<= 32767) // expected-warning {{comparison 'short' <= 32767 is always true}}
64 if (s
> 32767) // expected-warning {{comparison 'short' > 32767 is always false}}
73 if (32767 < s
) // expected-warning {{comparison 32767 < 'short' is always false}}
79 if (32767 >= s
) // expected-warning {{comparison 32767 >= 'short' is always true}}
82 // FIXME: assumes two's complement
87 if (s
< -32768) // expected-warning {{comparison 'short' < -32768 is always false}}
93 if (s
>= -32768) // expected-warning {{comparison 'short' >= -32768 is always true}}
102 if (-32768 <= s
) // expected-warning {{comparison -32768 <= 'short' is always true}}
104 if (-32768 > s
) // expected-warning {{comparison -32768 > 'short' is always false}}
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.
137 enum { ULONG_MAX
= (2UL * (unsigned long)__LONG_MAX__
+ 1UL) };
138 if (s
== 2UL * (unsigned long)__LONG_MAX__
+ 1UL)
140 if (s
!= 2UL * (unsigned long)__LONG_MAX__
+ 1UL)
142 if (s
< 2UL * (unsigned long)__LONG_MAX__
+ 1UL)
144 if (s
<= 2UL * (unsigned long)__LONG_MAX__
+ 1UL) // expected-warning-re {{comparison 'short' <= {{.*}} is always true}}
146 if (s
> 2UL * (unsigned long)__LONG_MAX__
+ 1UL) // expected-warning-re {{comparison 'short' > {{.*}} is always false}}
148 if (s
>= 2UL * (unsigned long)__LONG_MAX__
+ 1UL)
151 if (2UL * (unsigned long)__LONG_MAX__
+ 1UL == s
)
153 if (2UL * (unsigned long)__LONG_MAX__
+ 1UL != s
)
155 if (2UL * (unsigned long)__LONG_MAX__
+ 1UL < s
) // expected-warning-re {{comparison {{.*}} < 'short' is always false}}
157 if (2UL * (unsigned long)__LONG_MAX__
+ 1UL <= s
)
159 if (2UL * (unsigned long)__LONG_MAX__
+ 1UL > s
)
161 if (2UL * (unsigned long)__LONG_MAX__
+ 1UL >= s
) // expected-warning-re {{comparison {{.*}} >= 'short' is always true}}
164 // FIXME: assumes two's complement
169 if (s
< -32768L) // expected-warning {{comparison 'short' < -32768 is always false}}
175 if (s
>= -32768L) // expected-warning {{comparison 'short' >= -32768 is always true}}
184 if (-32768L <= s
) // expected-warning {{comparison -32768 <= 'short' is always true}}
186 if (-32768L > s
) // expected-warning {{comparison -32768 > 'short' is always false}}
217 // FIXME: assumes two's complement
270 // FIXME: assumes two's complement
324 unsigned short us
= value();
333 if (us
<= 65535) // expected-warning {{comparison 'unsigned short' <= 65535 is always true}}
335 if (us
> 65535) // expected-warning {{comparison 'unsigned short' > 65535 is always false}}
344 if (65535 < us
) // expected-warning {{comparison 65535 < 'unsigned short' is always false}}
350 if (65535 >= us
) // expected-warning {{comparison 65535 >= 'unsigned short' is always true}}
359 if (us
<= 65535UL) // expected-warning {{comparison 'unsigned short' <= 65535 is always true}}
361 if (us
> 65535UL) // expected-warning {{comparison 'unsigned short' > 65535 is always false}}
370 if (65535UL < us
) // expected-warning {{comparison 65535 < 'unsigned short' is always false}}
376 if (65535UL >= us
) // expected-warning {{comparison 65535 >= 'unsigned short' is always true}}
484 #if __SIZEOF_INT128__
485 __int128 i128
= value();
486 if (i128
== -1) // used to crash
496 enum E e
= (enum E
)value();
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.
560 if (a
.a
< 4) {} // #bitfield1
562 if (a
.b
< 8) {} // #bitfield2
564 if (a
.c
< 4) {} // #bitfield3
566 if (a
.d
< 8) {} // #bitfield4
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}}
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) {}
585 // expected-warning@#valuerange1 {{comparison of 8-bit unsigned value < 0 is always false}}
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
595 // expected-warning@#addrange1 {{comparison of 2-bit unsigned value > 3 is always false}}
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
610 // expected-warning@#mulrange1 {{comparison of 15-bit unsigned value > 32767 is always false}}
613 if (a
.a
* a
.b
> 21) {} // FIXME
614 if (a
.a
* a
.b
> 31) {} // #mulrange2
616 // expected-warning@#mulrange2 {{comparison of 6-bit signed value > 31 is always false}}
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
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}}
646 // a.a % 3 is in range [-2, 2], which we expand to [-4, 4)
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)
656 if (a
.b
% 3 > 3) {} // #remrange3
657 if (a
.b
% 3 < 0) {} // #remrange4
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}}
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.
669 if (((void)s
, 0) == 0) {}