133 lines
3.3 KiB
Rust
133 lines
3.3 KiB
Rust
#![allow(
|
|
clippy::erasing_op,
|
|
clippy::no_effect,
|
|
clippy::unnecessary_operation,
|
|
clippy::unnecessary_cast,
|
|
clippy::op_ref
|
|
)]
|
|
#![warn(clippy::decimal_bitwise_operands)]
|
|
|
|
macro_rules! bitwise_op {
|
|
($x:expr, $y:expr) => {
|
|
$x & $y;
|
|
};
|
|
}
|
|
|
|
pub const SOME_CONST: i32 = 12345;
|
|
|
|
fn main() {
|
|
let mut x = 0;
|
|
// BAD: Bitwise operation, decimal literal, one literal
|
|
x & 9_8765_4321; //~ decimal_bitwise_operands
|
|
x & 100_i32; //~ decimal_bitwise_operands
|
|
x | (/* comment */99); //~ decimal_bitwise_operands
|
|
x ^ (99); //~ decimal_bitwise_operands
|
|
x &= 99; //~ decimal_bitwise_operands
|
|
x |= { 99 }; //~ decimal_bitwise_operands
|
|
x |= { { 99 } }; //~ decimal_bitwise_operands
|
|
x |= {
|
|
0b1000;
|
|
99 //~ decimal_bitwise_operands
|
|
};
|
|
x ^= (99); //~ decimal_bitwise_operands
|
|
|
|
// BAD: Bitwise operation, decimal literal, two literals
|
|
0b1010 & 99; //~ decimal_bitwise_operands
|
|
0b1010 | (99); //~ decimal_bitwise_operands
|
|
0b1010 ^ (/* comment */99); //~ decimal_bitwise_operands
|
|
99 & 0b1010; //~ decimal_bitwise_operands
|
|
(99) | 0b1010; //~ decimal_bitwise_operands
|
|
(/* comment */99) ^ 0b1010; //~ decimal_bitwise_operands
|
|
0xD | { 99 }; //~ decimal_bitwise_operands
|
|
88 & 99;
|
|
//~^ decimal_bitwise_operands
|
|
//~| decimal_bitwise_operands
|
|
37 & 38 & 39;
|
|
//~^ decimal_bitwise_operands
|
|
//~| decimal_bitwise_operands
|
|
//~| decimal_bitwise_operands
|
|
|
|
// GOOD: Bitwise operation, binary/hex/octal literal, one literal
|
|
x & 0b1010;
|
|
x | 0b1010;
|
|
x ^ 0b1010;
|
|
x &= 0b1010;
|
|
x |= 0b1010;
|
|
x ^= 0b1010;
|
|
x & 0xD;
|
|
x & 0o77;
|
|
x | 0o123;
|
|
x ^ 0o377;
|
|
x &= 0o777;
|
|
x |= 0o7;
|
|
x ^= 0o70;
|
|
|
|
// GOOD: Bitwise operation, binary/hex/octal literal, two literals
|
|
0b1010 & 0b1101;
|
|
0xD ^ 0xF;
|
|
0o377 ^ 0o77;
|
|
0b1101 ^ 0xFF;
|
|
|
|
// GOOD: Numeric operation, any literal
|
|
x += 99;
|
|
x -= 0b1010;
|
|
x *= 0xD;
|
|
99 + 99;
|
|
0b1010 - 0b1101;
|
|
0xD * 0xD;
|
|
|
|
// BAD: Unary, cast and reference, decimal literal
|
|
x & !100; //~ decimal_bitwise_operands
|
|
x & -100; //~ decimal_bitwise_operands
|
|
x & (100 as i32); //~ decimal_bitwise_operands
|
|
x & &100; //~ decimal_bitwise_operands
|
|
|
|
// GOOD: Unary, cast and reference, non-decimal literal
|
|
x & !0b1101;
|
|
x & -0xD;
|
|
x & (0o333 as i32);
|
|
x & &0b1010;
|
|
|
|
// GOOD: Bitwise operation, variables only
|
|
let y = 0;
|
|
x & y;
|
|
x &= y;
|
|
x + y;
|
|
x += y;
|
|
|
|
// GOOD: Macro expansion (should be ignored)
|
|
bitwise_op!(x, 123);
|
|
bitwise_op!(0b1010, 123);
|
|
|
|
// GOOD: Using const (should be ignored)
|
|
x & SOME_CONST;
|
|
x |= SOME_CONST;
|
|
|
|
// GOOD: Parenthesized binary/hex literal (should not trigger lint)
|
|
x & (0b1111);
|
|
x |= (0b1010);
|
|
x ^ (/* comment */0b1100);
|
|
(0xFF) & x;
|
|
|
|
// GOOD: Power of two and power of two minus one
|
|
x & 16; // 2^4
|
|
x | (31); // 2^5 - 1
|
|
x ^ 0x40; // 2^6 (hex)
|
|
x ^= 7; // 2^3 - 1
|
|
|
|
// GOOD: Bitwise operation, single digit decimal literal
|
|
5 & 9;
|
|
x ^ 6;
|
|
x ^= 7;
|
|
|
|
// GOOD: More complex expressions
|
|
(x + 1) & 0xFF;
|
|
(x * 2) | (y & 0xF);
|
|
(x ^ y) & 0b11110000;
|
|
x | (1 << 9);
|
|
|
|
// GOOD: Special cases
|
|
x & 0; // All bits off
|
|
x | !0; // All bits on
|
|
x ^ 1; // Toggle LSB
|
|
}
|