diff --git a/clippy_lints/src/literal_representation.rs b/clippy_lints/src/literal_representation.rs index 6c2351d43dd..b40ddca5cbf 100644 --- a/clippy_lints/src/literal_representation.rs +++ b/clippy_lints/src/literal_representation.rs @@ -193,7 +193,7 @@ impl<'a> DigitInfo<'a> { self.suffix.unwrap_or("") ) } else { - let hint = self.digits + let mut hint = self.digits .chars() .rev() .filter(|&c| c != '_') @@ -203,6 +203,12 @@ impl<'a> DigitInfo<'a> { .rev() .collect::<Vec<String>>() .join("_"); + // Forces hexadecimal values to be grouped by 4 being filled with zeroes (e.g 0x00ab_cdef) + let nb_digits_to_fill = self.digits.len() % 4; + if self.radix == Radix::Hexadecimal && nb_digits_to_fill != 0 { + let filled_digits = format!("{:0>1$}", &hint[..nb_digits_to_fill], 4); + hint = format!("{}{}", filled_digits, &hint[nb_digits_to_fill..]); + } format!( "{}{}{}", self.prefix.unwrap_or(""), diff --git a/tests/ui/literals.rs b/tests/ui/literals.rs index c11adc0b090..7be11072b0b 100644 --- a/tests/ui/literals.rs +++ b/tests/ui/literals.rs @@ -1,5 +1,3 @@ - - #![warn(mixed_case_hex_literals)] #![warn(unseparated_literal_suffix)] #![warn(zero_prefixed_literal)] @@ -31,4 +29,10 @@ fn main() { let ok11 = 0o123; let ok12 = 0b10_1010; + + let ok6 = 0xab_abcd; + let ok7 = 0xBAFE_BAFE; + let fail9 = 0xabcdef; + let fail10 = 0xBAFEBAFE; + let fail11 = 0xabcdeff; } diff --git a/tests/ui/literals.stderr b/tests/ui/literals.stderr index 92540b73462..703adbfd280 100644 --- a/tests/ui/literals.stderr +++ b/tests/ui/literals.stderr @@ -1,90 +1,110 @@ error: inconsistent casing in hexadecimal literal - --> $DIR/literals.rs:14:17 + --> $DIR/literals.rs:12:17 | -14 | let fail1 = 0xabCD; +12 | let fail1 = 0xabCD; | ^^^^^^ | = note: `-D mixed-case-hex-literals` implied by `-D warnings` error: inconsistent casing in hexadecimal literal - --> $DIR/literals.rs:15:17 + --> $DIR/literals.rs:13:17 | -15 | let fail2 = 0xabCD_u32; +13 | let fail2 = 0xabCD_u32; | ^^^^^^^^^^ error: inconsistent casing in hexadecimal literal - --> $DIR/literals.rs:16:17 + --> $DIR/literals.rs:14:17 | -16 | let fail2 = 0xabCD_isize; +14 | let fail2 = 0xabCD_isize; | ^^^^^^^^^^^^ error: integer type suffix should be separated by an underscore - --> $DIR/literals.rs:17:27 + --> $DIR/literals.rs:15:27 | -17 | let fail_multi_zero = 000_123usize; +15 | let fail_multi_zero = 000_123usize; | ^^^^^^^^^^^^ | = note: `-D unseparated-literal-suffix` implied by `-D warnings` error: this is a decimal constant - --> $DIR/literals.rs:17:27 + --> $DIR/literals.rs:15:27 | -17 | let fail_multi_zero = 000_123usize; +15 | let fail_multi_zero = 000_123usize; | ^^^^^^^^^^^^ | = note: `-D zero-prefixed-literal` implied by `-D warnings` help: if you mean to use a decimal constant, remove the `0` to remove confusion | -17 | let fail_multi_zero = 123usize; +15 | let fail_multi_zero = 123usize; | ^^^^^^^^ help: if you mean to use an octal constant, use `0o` | -17 | let fail_multi_zero = 0o123usize; +15 | let fail_multi_zero = 0o123usize; | ^^^^^^^^^^ +error: integer type suffix should be separated by an underscore + --> $DIR/literals.rs:20:17 + | +20 | let fail3 = 1234i32; + | ^^^^^^^ + +error: integer type suffix should be separated by an underscore + --> $DIR/literals.rs:21:17 + | +21 | let fail4 = 1234u32; + | ^^^^^^^ + error: integer type suffix should be separated by an underscore --> $DIR/literals.rs:22:17 | -22 | let fail3 = 1234i32; - | ^^^^^^^ +22 | let fail5 = 1234isize; + | ^^^^^^^^^ error: integer type suffix should be separated by an underscore --> $DIR/literals.rs:23:17 | -23 | let fail4 = 1234u32; - | ^^^^^^^ - -error: integer type suffix should be separated by an underscore - --> $DIR/literals.rs:24:17 - | -24 | let fail5 = 1234isize; - | ^^^^^^^^^ - -error: integer type suffix should be separated by an underscore - --> $DIR/literals.rs:25:17 - | -25 | let fail6 = 1234usize; +23 | let fail6 = 1234usize; | ^^^^^^^^^ error: float type suffix should be separated by an underscore - --> $DIR/literals.rs:26:17 + --> $DIR/literals.rs:24:17 | -26 | let fail7 = 1.5f32; +24 | let fail7 = 1.5f32; | ^^^^^^ error: this is a decimal constant - --> $DIR/literals.rs:30:17 + --> $DIR/literals.rs:28:17 | -30 | let fail8 = 0123; +28 | let fail8 = 0123; | ^^^^ help: if you mean to use a decimal constant, remove the `0` to remove confusion | -30 | let fail8 = 123; +28 | let fail8 = 123; | ^^^ help: if you mean to use an octal constant, use `0o` | -30 | let fail8 = 0o123; +28 | let fail8 = 0o123; | ^^^^^ -error: aborting due to 11 previous errors +error: long literal lacking separators + --> $DIR/literals.rs:35:17 + | +35 | let fail9 = 0xabcdef; + | ^^^^^^^^ help: consider: `0x00ab_cdef` + | + = note: `-D unreadable-literal` implied by `-D warnings` + +error: long literal lacking separators + --> $DIR/literals.rs:36:18 + | +36 | let fail10 = 0xBAFEBAFE; + | ^^^^^^^^^^ help: consider: `0xBAFE_BAFE` + +error: long literal lacking separators + --> $DIR/literals.rs:37:18 + | +37 | let fail11 = 0xabcdeff; + | ^^^^^^^^^ help: consider: `0x0abc_deff` + +error: aborting due to 14 previous errors