From 73deb723ddb5ff39d830e698136f081b47f3a94b Mon Sep 17 00:00:00 2001 From: mlegner Date: Tue, 3 Mar 2020 17:05:09 +0100 Subject: [PATCH] Included binary and octal cases. --- clippy_lints/src/literal_representation.rs | 14 +++++++++----- clippy_lints/src/types.rs | 5 ++--- tests/ui/unnecessary_cast_fixable.fixed | 7 ++++++- tests/ui/unnecessary_cast_fixable.rs | 7 ++++++- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/clippy_lints/src/literal_representation.rs b/clippy_lints/src/literal_representation.rs index 43b2c4e78b4..a42d240ba64 100644 --- a/clippy_lints/src/literal_representation.rs +++ b/clippy_lints/src/literal_representation.rs @@ -131,7 +131,7 @@ pub fn format_numeric_literal(lit: &str, type_suffix: Option<&str>, float: bool) #[derive(Debug)] pub(super) struct NumericLiteral<'a> { /// Which radix the literal was represented in. - pub radix: Radix, + radix: Radix, /// The radix prefix, if present. prefix: Option<&'a str>, @@ -147,6 +147,10 @@ pub(super) struct NumericLiteral<'a> { } impl<'a> NumericLiteral<'a> { + fn from_lit(src: &'a str, lit: &Lit) -> Option> { + NumericLiteral::from_lit_kind(src, &lit.kind) + } + pub fn from_lit_kind(src: &'a str, lit_kind: &LitKind) -> Option> { if lit_kind.is_numeric() && src.chars().next().map_or(false, |c| c.is_digit(10)) { let (unsuffixed, suffix) = split_suffix(&src, lit_kind); @@ -157,10 +161,6 @@ impl<'a> NumericLiteral<'a> { } } - fn from_lit(src: &'a str, lit: &Lit) -> Option> { - NumericLiteral::from_lit_kind(src, &lit.kind) - } - #[must_use] fn new(lit: &'a str, suffix: Option<&'a str>, float: bool) -> Self { // Determine delimiter for radix prefix, if present, and radix. @@ -199,6 +199,10 @@ impl<'a> NumericLiteral<'a> { } } + pub fn is_decimal(&self) -> bool { + self.radix == Radix::Decimal + } + fn split_digit_parts(digits: &str, float: bool) -> (&str, Option<&str>, Option<(char, &str)>) { let mut integer = digits; let mut fraction = None; diff --git a/clippy_lints/src/types.rs b/clippy_lints/src/types.rs index ada5c8f2d9f..0ecd03605b2 100644 --- a/clippy_lints/src/types.rs +++ b/clippy_lints/src/types.rs @@ -27,7 +27,7 @@ use rustc_target::spec::abi::Abi; use rustc_typeck::hir_ty_to_ty; use crate::consts::{constant, Constant}; -use crate::literal_representation::{NumericLiteral, Radix}; +use crate::literal_representation::NumericLiteral; use crate::utils::paths; use crate::utils::{ clip, comparisons, differing_macro_contexts, higher, in_constant, int_bits, last_path_segment, match_def_path, @@ -1219,8 +1219,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Casts { let from_nbits = 128 - n.leading_zeros(); let to_nbits = fp_ty_mantissa_nbits(cast_to); if let Some(num_lit) = NumericLiteral::from_lit_kind(&src, &lit.node) { - if from_nbits != 0 && to_nbits != 0 && from_nbits <= to_nbits && - num_lit.radix != Radix::Hexadecimal { + if from_nbits != 0 && to_nbits != 0 && from_nbits <= to_nbits && num_lit.is_decimal() { span_lint_and_sugg( cx, UNNECESSARY_CAST, diff --git a/tests/ui/unnecessary_cast_fixable.fixed b/tests/ui/unnecessary_cast_fixable.fixed index 578ad5c8d33..fb89a9fce3d 100644 --- a/tests/ui/unnecessary_cast_fixable.fixed +++ b/tests/ui/unnecessary_cast_fixable.fixed @@ -14,5 +14,10 @@ fn main() { &v as &[i32]; 1.0 as f64; 1 as u64; - 0x42 as f32; + 0x10 as f32; + 0o10 as f32; + 0b10 as f32; + 0x11 as f64; + 0o11 as f64; + 0b11 as f64; } diff --git a/tests/ui/unnecessary_cast_fixable.rs b/tests/ui/unnecessary_cast_fixable.rs index b3518231abe..4a0c8620dc1 100644 --- a/tests/ui/unnecessary_cast_fixable.rs +++ b/tests/ui/unnecessary_cast_fixable.rs @@ -14,5 +14,10 @@ fn main() { &v as &[i32]; 1.0 as f64; 1 as u64; - 0x42 as f32; + 0x10 as f32; + 0o10 as f32; + 0b10 as f32; + 0x11 as f64; + 0o11 as f64; + 0b11 as f64; }