| #![expect( | |
| clippy::erasing_op, | |
| clippy::no_effect, | |
| clippy::op_ref, | |
| clippy::unnecessary_cast, | |
| clippy::unnecessary_operation | |
| )] | |
| #![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 | |
| } |