about summary refs log tree commit diff
diff options
context:
space:
mode:
authormlegner <markus@legner.ch>2020-03-03 17:05:09 +0100
committermlegner <markus@legner.ch>2020-03-04 13:21:01 +0100
commit73deb723ddb5ff39d830e698136f081b47f3a94b (patch)
tree201c9452d4ff832dcaa9ef16deebdd2ac66814df
parent6673cc8329a2bc1395cf6c3c1ec194cbd83b567e (diff)
downloadrust-73deb723ddb5ff39d830e698136f081b47f3a94b.tar.gz
rust-73deb723ddb5ff39d830e698136f081b47f3a94b.zip
Included binary and octal cases.
-rw-r--r--clippy_lints/src/literal_representation.rs14
-rw-r--r--clippy_lints/src/types.rs5
-rw-r--r--tests/ui/unnecessary_cast_fixable.fixed7
-rw-r--r--tests/ui/unnecessary_cast_fixable.rs7
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<'a>> {
+        NumericLiteral::from_lit_kind(src, &lit.kind)
+    }
+
     pub fn from_lit_kind(src: &'a str, lit_kind: &LitKind) -> Option<NumericLiteral<'a>> {
         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<'a>> {
-        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;
 }