Skip to content

Commit dea03e4

Browse files
committed
Split and extend tests for bad_bit_mask and ineffective_bit_mask.
1 parent 5ce5b89 commit dea03e4

File tree

6 files changed

+783
-203
lines changed

6 files changed

+783
-203
lines changed

tests/ui/bad_bit_masks.rs

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
//@aux-build:proc_macros.rs
2+
3+
#![warn(clippy::bad_bit_mask)]
4+
#![allow(clippy::erasing_op, clippy::ineffective_bit_mask, clippy::identity_op)]
5+
6+
use core::hint::black_box;
7+
use proc_macros::{external, with_span};
8+
9+
fn main() {
10+
let x = black_box(5u32);
11+
12+
let _ = x & 0b0000 == 0b0000; //~ bad_bit_mask
13+
let _ = x & 0b0000 == 0b0001; //~ bad_bit_mask
14+
let _ = x & 0b0001 == 0b0000;
15+
let _ = x & 0b0001 == 0b0001;
16+
let _ = x & 0b0010 == 0b0001; //~ bad_bit_mask
17+
let _ = x & 0b0001 == 0b0010; //~ bad_bit_mask
18+
let _ = x & 0b0011 == 0b0001;
19+
let _ = x & 0b0011 == 0b0010;
20+
let _ = x & 0b0011 == 0b0011;
21+
let _ = x & 0b0011 == 0b0100; //~ bad_bit_mask
22+
let _ = x & 0b0100 == 0b0100;
23+
let _ = x & 0b0110 == 0b0111; //~ bad_bit_mask
24+
let _ = x & 0b0011 == 0b0101; //~ bad_bit_mask
25+
let _ = x & 0b1111 == 0b1110;
26+
let _ = x & 0b1111 == 0b1010;
27+
28+
let _ = x | 0b0000 == 0b0000;
29+
let _ = x | 0b0000 == 0b0001;
30+
let _ = x | 0b0001 == 0b0000; //~ bad_bit_mask
31+
let _ = x | 0b0001 == 0b0001;
32+
let _ = x | 0b0010 == 0b0001; //~ bad_bit_mask
33+
let _ = x | 0b0001 == 0b0010; //~ bad_bit_mask
34+
let _ = x | 0b0011 == 0b0001; //~ bad_bit_mask
35+
let _ = x | 0b0011 == 0b0010; //~ bad_bit_mask
36+
let _ = x | 0b0011 == 0b0011;
37+
let _ = x | 0b0011 == 0b0100; //~ bad_bit_mask
38+
let _ = x | 0b0100 == 0b0100;
39+
let _ = x | 0b0110 == 0b0111;
40+
let _ = x | 0b0011 == 0b0101; //~ bad_bit_mask
41+
let _ = x | 0b1111 == 0b1110; //~ bad_bit_mask
42+
let _ = x | 0b1111 == 0b1010; //~ bad_bit_mask
43+
44+
let _ = x & 0b0000 != 0b0000; //~ bad_bit_mask
45+
let _ = x & 0b0000 != 0b0001; //~ bad_bit_mask
46+
let _ = x & 0b0001 != 0b0000;
47+
let _ = x & 0b0001 != 0b0001;
48+
let _ = x & 0b0010 != 0b0001; //~ bad_bit_mask
49+
let _ = x & 0b0001 != 0b0010; //~ bad_bit_mask
50+
let _ = x & 0b0011 != 0b0001;
51+
let _ = x & 0b0011 != 0b0010;
52+
let _ = x & 0b0011 != 0b0011;
53+
let _ = x & 0b0011 != 0b0100; //~ bad_bit_mask
54+
let _ = x & 0b0100 != 0b0100;
55+
let _ = x & 0b0110 != 0b0111; //~ bad_bit_mask
56+
let _ = x & 0b0011 != 0b0101; //~ bad_bit_mask
57+
let _ = x & 0b1111 != 0b1110;
58+
let _ = x & 0b1111 != 0b1010;
59+
60+
let _ = x | 0b0000 != 0b0000;
61+
let _ = x | 0b0000 != 0b0001;
62+
let _ = x | 0b0001 != 0b0000; //~ bad_bit_mask
63+
let _ = x | 0b0001 != 0b0001;
64+
let _ = x | 0b0010 != 0b0001; //~ bad_bit_mask
65+
let _ = x | 0b0001 != 0b0010; //~ bad_bit_mask
66+
let _ = x | 0b0011 != 0b0001; //~ bad_bit_mask
67+
let _ = x | 0b0011 != 0b0010; //~ bad_bit_mask
68+
let _ = x | 0b0011 != 0b0011;
69+
let _ = x | 0b0011 != 0b0100; //~ bad_bit_mask
70+
let _ = x | 0b0100 != 0b0100;
71+
let _ = x | 0b0110 != 0b0111;
72+
let _ = x | 0b0011 != 0b0101; //~ bad_bit_mask
73+
let _ = x | 0b1111 != 0b1110; //~ bad_bit_mask
74+
let _ = x | 0b1111 != 0b1010; //~ bad_bit_mask
75+
76+
let _ = 0b0010 & x == 0b0001; //~ bad_bit_mask
77+
let _ = 0b0001 == x & 0b0010; //~ bad_bit_mask
78+
let _ = 0b0001 == 0b0010 & x; //~ bad_bit_mask
79+
80+
let _ = x & (0b0100 | 0b0010) == (0b0111 ^ 0b1000); //~ bad_bit_mask
81+
82+
external! {
83+
let x = black_box(5u32);
84+
let _ = x & 0b0010 == 0b0001;
85+
}
86+
with_span! {
87+
sp
88+
let x = black_box(5u32);
89+
let _ = x & 0b0010 == 0b0001;
90+
}
91+
92+
{
93+
const C: i32 = 0b0011;
94+
95+
let x = black_box(5i32);
96+
let _ = x & C == 0b0011;
97+
let _ = x & C == 0b0100; //~ bad_bit_mask
98+
let _ = x & 0b0001 == C; //~ bad_bit_mask
99+
}
100+
}

tests/ui/bad_bit_masks.stderr

Lines changed: 233 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,233 @@
1+
error: &-masking with zero
2+
--> tests/ui/bad_bit_masks.rs:12:13
3+
|
4+
LL | let _ = x & 0b0000 == 0b0000;
5+
| ^^^^^^^^^^^^^^^^^^^^
6+
|
7+
= note: `-D clippy::bad-bit-mask` implied by `-D warnings`
8+
= help: to override `-D warnings` add `#[allow(clippy::bad_bit_mask)]`
9+
10+
error: incompatible bit mask: `_ & 0` can never be equal to `1`
11+
--> tests/ui/bad_bit_masks.rs:13:13
12+
|
13+
LL | let _ = x & 0b0000 == 0b0001;
14+
| ^^^^^^^^^^^^^^^^^^^^
15+
16+
error: incompatible bit mask: `_ & 2` can never be equal to `1`
17+
--> tests/ui/bad_bit_masks.rs:16:13
18+
|
19+
LL | let _ = x & 0b0010 == 0b0001;
20+
| ^^^^^^^^^^^^^^^^^^^^
21+
22+
error: incompatible bit mask: `_ & 1` can never be equal to `2`
23+
--> tests/ui/bad_bit_masks.rs:17:13
24+
|
25+
LL | let _ = x & 0b0001 == 0b0010;
26+
| ^^^^^^^^^^^^^^^^^^^^
27+
28+
error: incompatible bit mask: `_ & 3` can never be equal to `4`
29+
--> tests/ui/bad_bit_masks.rs:21:13
30+
|
31+
LL | let _ = x & 0b0011 == 0b0100;
32+
| ^^^^^^^^^^^^^^^^^^^^
33+
34+
error: incompatible bit mask: `_ & 6` can never be equal to `7`
35+
--> tests/ui/bad_bit_masks.rs:23:13
36+
|
37+
LL | let _ = x & 0b0110 == 0b0111;
38+
| ^^^^^^^^^^^^^^^^^^^^
39+
40+
error: incompatible bit mask: `_ & 3` can never be equal to `5`
41+
--> tests/ui/bad_bit_masks.rs:24:13
42+
|
43+
LL | let _ = x & 0b0011 == 0b0101;
44+
| ^^^^^^^^^^^^^^^^^^^^
45+
46+
error: incompatible bit mask: `_ | 1` can never be equal to `0`
47+
--> tests/ui/bad_bit_masks.rs:30:13
48+
|
49+
LL | let _ = x | 0b0001 == 0b0000;
50+
| ^^^^^^^^^^^^^^^^^^^^
51+
52+
error: incompatible bit mask: `_ | 2` can never be equal to `1`
53+
--> tests/ui/bad_bit_masks.rs:32:13
54+
|
55+
LL | let _ = x | 0b0010 == 0b0001;
56+
| ^^^^^^^^^^^^^^^^^^^^
57+
58+
error: incompatible bit mask: `_ | 1` can never be equal to `2`
59+
--> tests/ui/bad_bit_masks.rs:33:13
60+
|
61+
LL | let _ = x | 0b0001 == 0b0010;
62+
| ^^^^^^^^^^^^^^^^^^^^
63+
64+
error: incompatible bit mask: `_ | 3` can never be equal to `1`
65+
--> tests/ui/bad_bit_masks.rs:34:13
66+
|
67+
LL | let _ = x | 0b0011 == 0b0001;
68+
| ^^^^^^^^^^^^^^^^^^^^
69+
70+
error: incompatible bit mask: `_ | 3` can never be equal to `2`
71+
--> tests/ui/bad_bit_masks.rs:35:13
72+
|
73+
LL | let _ = x | 0b0011 == 0b0010;
74+
| ^^^^^^^^^^^^^^^^^^^^
75+
76+
error: incompatible bit mask: `_ | 3` can never be equal to `4`
77+
--> tests/ui/bad_bit_masks.rs:37:13
78+
|
79+
LL | let _ = x | 0b0011 == 0b0100;
80+
| ^^^^^^^^^^^^^^^^^^^^
81+
82+
error: incompatible bit mask: `_ | 3` can never be equal to `5`
83+
--> tests/ui/bad_bit_masks.rs:40:13
84+
|
85+
LL | let _ = x | 0b0011 == 0b0101;
86+
| ^^^^^^^^^^^^^^^^^^^^
87+
88+
error: incompatible bit mask: `_ | 15` can never be equal to `14`
89+
--> tests/ui/bad_bit_masks.rs:41:13
90+
|
91+
LL | let _ = x | 0b1111 == 0b1110;
92+
| ^^^^^^^^^^^^^^^^^^^^
93+
94+
error: incompatible bit mask: `_ | 15` can never be equal to `10`
95+
--> tests/ui/bad_bit_masks.rs:42:13
96+
|
97+
LL | let _ = x | 0b1111 == 0b1010;
98+
| ^^^^^^^^^^^^^^^^^^^^
99+
100+
error: &-masking with zero
101+
--> tests/ui/bad_bit_masks.rs:44:13
102+
|
103+
LL | let _ = x & 0b0000 != 0b0000;
104+
| ^^^^^^^^^^^^^^^^^^^^
105+
106+
error: incompatible bit mask: `_ & 0` can never be equal to `1`
107+
--> tests/ui/bad_bit_masks.rs:45:13
108+
|
109+
LL | let _ = x & 0b0000 != 0b0001;
110+
| ^^^^^^^^^^^^^^^^^^^^
111+
112+
error: incompatible bit mask: `_ & 2` can never be equal to `1`
113+
--> tests/ui/bad_bit_masks.rs:48:13
114+
|
115+
LL | let _ = x & 0b0010 != 0b0001;
116+
| ^^^^^^^^^^^^^^^^^^^^
117+
118+
error: incompatible bit mask: `_ & 1` can never be equal to `2`
119+
--> tests/ui/bad_bit_masks.rs:49:13
120+
|
121+
LL | let _ = x & 0b0001 != 0b0010;
122+
| ^^^^^^^^^^^^^^^^^^^^
123+
124+
error: incompatible bit mask: `_ & 3` can never be equal to `4`
125+
--> tests/ui/bad_bit_masks.rs:53:13
126+
|
127+
LL | let _ = x & 0b0011 != 0b0100;
128+
| ^^^^^^^^^^^^^^^^^^^^
129+
130+
error: incompatible bit mask: `_ & 6` can never be equal to `7`
131+
--> tests/ui/bad_bit_masks.rs:55:13
132+
|
133+
LL | let _ = x & 0b0110 != 0b0111;
134+
| ^^^^^^^^^^^^^^^^^^^^
135+
136+
error: incompatible bit mask: `_ & 3` can never be equal to `5`
137+
--> tests/ui/bad_bit_masks.rs:56:13
138+
|
139+
LL | let _ = x & 0b0011 != 0b0101;
140+
| ^^^^^^^^^^^^^^^^^^^^
141+
142+
error: incompatible bit mask: `_ | 1` can never be equal to `0`
143+
--> tests/ui/bad_bit_masks.rs:62:13
144+
|
145+
LL | let _ = x | 0b0001 != 0b0000;
146+
| ^^^^^^^^^^^^^^^^^^^^
147+
148+
error: incompatible bit mask: `_ | 2` can never be equal to `1`
149+
--> tests/ui/bad_bit_masks.rs:64:13
150+
|
151+
LL | let _ = x | 0b0010 != 0b0001;
152+
| ^^^^^^^^^^^^^^^^^^^^
153+
154+
error: incompatible bit mask: `_ | 1` can never be equal to `2`
155+
--> tests/ui/bad_bit_masks.rs:65:13
156+
|
157+
LL | let _ = x | 0b0001 != 0b0010;
158+
| ^^^^^^^^^^^^^^^^^^^^
159+
160+
error: incompatible bit mask: `_ | 3` can never be equal to `1`
161+
--> tests/ui/bad_bit_masks.rs:66:13
162+
|
163+
LL | let _ = x | 0b0011 != 0b0001;
164+
| ^^^^^^^^^^^^^^^^^^^^
165+
166+
error: incompatible bit mask: `_ | 3` can never be equal to `2`
167+
--> tests/ui/bad_bit_masks.rs:67:13
168+
|
169+
LL | let _ = x | 0b0011 != 0b0010;
170+
| ^^^^^^^^^^^^^^^^^^^^
171+
172+
error: incompatible bit mask: `_ | 3` can never be equal to `4`
173+
--> tests/ui/bad_bit_masks.rs:69:13
174+
|
175+
LL | let _ = x | 0b0011 != 0b0100;
176+
| ^^^^^^^^^^^^^^^^^^^^
177+
178+
error: incompatible bit mask: `_ | 3` can never be equal to `5`
179+
--> tests/ui/bad_bit_masks.rs:72:13
180+
|
181+
LL | let _ = x | 0b0011 != 0b0101;
182+
| ^^^^^^^^^^^^^^^^^^^^
183+
184+
error: incompatible bit mask: `_ | 15` can never be equal to `14`
185+
--> tests/ui/bad_bit_masks.rs:73:13
186+
|
187+
LL | let _ = x | 0b1111 != 0b1110;
188+
| ^^^^^^^^^^^^^^^^^^^^
189+
190+
error: incompatible bit mask: `_ | 15` can never be equal to `10`
191+
--> tests/ui/bad_bit_masks.rs:74:13
192+
|
193+
LL | let _ = x | 0b1111 != 0b1010;
194+
| ^^^^^^^^^^^^^^^^^^^^
195+
196+
error: incompatible bit mask: `_ & 2` can never be equal to `1`
197+
--> tests/ui/bad_bit_masks.rs:76:13
198+
|
199+
LL | let _ = 0b0010 & x == 0b0001;
200+
| ^^^^^^^^^^^^^^^^^^^^
201+
202+
error: incompatible bit mask: `_ & 2` can never be equal to `1`
203+
--> tests/ui/bad_bit_masks.rs:77:13
204+
|
205+
LL | let _ = 0b0001 == x & 0b0010;
206+
| ^^^^^^^^^^^^^^^^^^^^
207+
208+
error: incompatible bit mask: `_ & 2` can never be equal to `1`
209+
--> tests/ui/bad_bit_masks.rs:78:13
210+
|
211+
LL | let _ = 0b0001 == 0b0010 & x;
212+
| ^^^^^^^^^^^^^^^^^^^^
213+
214+
error: incompatible bit mask: `_ & 6` can never be equal to `15`
215+
--> tests/ui/bad_bit_masks.rs:80:13
216+
|
217+
LL | let _ = x & (0b0100 | 0b0010) == (0b0111 ^ 0b1000);
218+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
219+
220+
error: incompatible bit mask: `_ & 3` can never be equal to `4`
221+
--> tests/ui/bad_bit_masks.rs:97:17
222+
|
223+
LL | let _ = x & C == 0b0100;
224+
| ^^^^^^^^^^^^^^^
225+
226+
error: incompatible bit mask: `_ & 1` can never be equal to `3`
227+
--> tests/ui/bad_bit_masks.rs:98:17
228+
|
229+
LL | let _ = x & 0b0001 == C;
230+
| ^^^^^^^^^^^^^^^
231+
232+
error: aborting due to 38 previous errors
233+

0 commit comments

Comments
 (0)