]> git.lizzy.rs Git - rust.git/blob - tests/ui/bit_masks.rs
Add license header to Rust files
[rust.git] / tests / ui / bit_masks.rs
1 // Copyright 2014-2018 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution.
3 //
4 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
5 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
7 // option. This file may not be copied, modified, or distributed
8 // except according to those terms.
9
10
11 #![feature(tool_lints)]
12
13
14 const THREE_BITS : i64 = 7;
15 const EVEN_MORE_REDIRECTION : i64 = THREE_BITS;
16
17 #[warn(clippy::bad_bit_mask)]
18 #[allow(clippy::ineffective_bit_mask, clippy::identity_op, clippy::no_effect, clippy::unnecessary_operation)]
19 fn main() {
20     let x = 5;
21
22     x & 0 == 0;
23     x & 1 == 1; //ok, distinguishes bit 0
24     x & 1 == 0; //ok, compared with zero
25     x & 2 == 1;
26     x | 0 == 0; //ok, equals x == 0 (maybe warn?)
27     x | 1 == 3; //ok, equals x == 2 || x == 3
28     x | 3 == 3; //ok, equals x <= 3
29     x | 3 == 2;
30
31     x & 1 > 1;
32     x & 2 > 1; // ok, distinguishes x & 2 == 2 from x & 2 == 0
33     x & 2 < 1; // ok, distinguishes x & 2 == 2 from x & 2 == 0
34     x | 1 > 1; // ok (if a bit silly), equals x > 1
35     x | 2 > 1;
36     x | 2 <= 2; // ok (if a bit silly), equals x <= 2
37
38     x & 192 == 128; // ok, tests for bit 7 and not bit 6
39     x & 0xffc0 == 0xfe80; // ok
40
41     // this also now works with constants
42     x & THREE_BITS == 8;
43     x | EVEN_MORE_REDIRECTION < 7;
44
45     0 & x == 0;
46     1 | x > 1;
47
48     // and should now also match uncommon usage
49     1 < 2 | x;
50     2 == 3 | x;
51     1 == x & 2;
52
53     x | 1 > 2; // no error, because we allowed ineffective bit masks
54     ineffective();
55 }
56
57 #[warn(clippy::ineffective_bit_mask)]
58 #[allow(clippy::bad_bit_mask, clippy::no_effect, clippy::unnecessary_operation)]
59 fn ineffective() {
60     let x = 5;
61
62     x | 1 > 3;
63     x | 1 < 4;
64     x | 1 <= 3;
65     x | 1 >= 8;
66
67     x | 1 > 2; // not an error (yet), better written as x >= 2
68     x | 1 >= 7; // not an error (yet), better written as x >= 6
69     x | 3 > 4; // not an error (yet), better written as x >= 4
70     x | 4 <= 19;
71 }