4 const THREE_BITS : i64 = 7;
5 const EVEN_MORE_REDIRECTION : i64 = THREE_BITS;
8 #[allow(ineffective_bit_mask, identity_op, no_effect)]
12 x & 0 == 0; //~ERROR &-masking with zero
13 x & 1 == 1; //ok, distinguishes bit 0
14 x & 1 == 0; //ok, compared with zero
15 x & 2 == 1; //~ERROR incompatible bit mask
16 x | 0 == 0; //ok, equals x == 0 (maybe warn?)
17 x | 1 == 3; //ok, equals x == 2 || x == 3
18 x | 3 == 3; //ok, equals x <= 3
19 x | 3 == 2; //~ERROR incompatible bit mask
21 x & 1 > 1; //~ERROR incompatible bit mask
22 x & 2 > 1; // ok, distinguishes x & 2 == 2 from x & 2 == 0
23 x & 2 < 1; // ok, distinguishes x & 2 == 2 from x & 2 == 0
24 x | 1 > 1; // ok (if a bit silly), equals x > 1
25 x | 2 > 1; //~ERROR incompatible bit mask
26 x | 2 <= 2; // ok (if a bit silly), equals x <= 2
28 x & 192 == 128; // ok, tests for bit 7 and not bit 6
29 x & 0xffc0 == 0xfe80; // ok
31 // this also now works with constants
32 x & THREE_BITS == 8; //~ERROR incompatible bit mask
33 x | EVEN_MORE_REDIRECTION < 7; //~ERROR incompatible bit mask
35 0 & x == 0; //~ERROR &-masking with zero
38 // and should now also match uncommon usage
39 1 < 2 | x; //~ERROR incompatible bit mask
40 2 == 3 | x; //~ERROR incompatible bit mask
41 1 == x & 2; //~ERROR incompatible bit mask
43 x | 1 > 2; // no error, because we allowed ineffective bit masks
47 #[deny(ineffective_bit_mask)]
48 #[allow(bad_bit_mask, no_effect)]
52 x | 1 > 3; //~ERROR ineffective bit mask
53 x | 1 < 4; //~ERROR ineffective bit mask
54 x | 1 <= 3; //~ERROR ineffective bit mask
55 x | 1 >= 8; //~ERROR ineffective bit mask
57 x | 1 > 2; // not an error (yet), better written as x >= 2
58 x | 1 >= 7; // not an error (yet), better written as x >= 6
59 x | 3 > 4; // not an error (yet), better written as x >= 4