about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2019-03-14 16:32:15 +0000
committerbors <bors@rust-lang.org>2019-03-14 16:32:15 +0000
commit9df38117d9fee4b2593ebeeccf98bc415485234a (patch)
tree7aa036fed0313c028fe16f248d095087ccfd046e
parent729892961c9e3b00919fd13d7ea2a704d03dd6a8 (diff)
parentd9dd008e446ee7cd804f41b3e8a494d0752e3106 (diff)
downloadrust-9df38117d9fee4b2593ebeeccf98bc415485234a.tar.gz
rust-9df38117d9fee4b2593ebeeccf98bc415485234a.zip
Auto merge of #3877 - rink1969:3842, r=flip1995
casting integer literal to float is unnecessary

fix issue https://github.com/rust-lang/rust-clippy/issues/3842
-rw-r--r--clippy_lints/src/types.rs30
-rw-r--r--tests/ui/cast.rs20
-rw-r--r--tests/ui/cast.stderr98
-rw-r--r--tests/ui/cast_lossless_float.fixed26
-rw-r--r--tests/ui/cast_lossless_float.rs26
-rw-r--r--tests/ui/cast_lossless_float.stderr60
-rw-r--r--tests/ui/cast_size.rs13
-rw-r--r--tests/ui/cast_size.stderr60
-rw-r--r--tests/ui/float_cmp_const.rs3
-rw-r--r--tests/ui/float_cmp_const.stderr18
10 files changed, 219 insertions, 135 deletions
diff --git a/clippy_lints/src/types.rs b/clippy_lints/src/types.rs
index 6f122daf71a..4ea34182294 100644
--- a/clippy_lints/src/types.rs
+++ b/clippy_lints/src/types.rs
@@ -10,7 +10,7 @@ use rustc::hir::intravisit::{walk_body, walk_expr, walk_ty, FnKind, NestedVisito
 use rustc::hir::*;
 use rustc::lint::{in_external_macro, LateContext, LateLintPass, LintArray, LintContext, LintPass};
 use rustc::ty::layout::LayoutOf;
-use rustc::ty::{self, Ty, TyCtxt, TypeckTables};
+use rustc::ty::{self, InferTy, Ty, TyCtxt, TypeckTables};
 use rustc::{declare_tool_lint, lint_array};
 use rustc_errors::Applicability;
 use rustc_target::spec::abi::Abi;
@@ -1150,6 +1150,16 @@ fn is_c_void(tcx: TyCtxt<'_, '_, '_>, ty: Ty<'_>) -> bool {
     false
 }
 
+/// Returns the mantissa bits wide of a fp type.
+/// Will return 0 if the type is not a fp
+fn fp_ty_mantissa_nbits(typ: Ty<'_>) -> u32 {
+    match typ.sty {
+        ty::Float(FloatTy::F32) => 23,
+        ty::Float(FloatTy::F64) | ty::Infer(InferTy::FloatVar(_)) => 52,
+        _ => 0,
+    }
+}
+
 impl<'a, 'tcx> LateLintPass<'a, 'tcx> for CastPass {
     fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) {
         if let ExprKind::Cast(ref ex, _) = expr.node {
@@ -1157,6 +1167,24 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for CastPass {
             lint_fn_to_numeric_cast(cx, expr, ex, cast_from, cast_to);
             if let ExprKind::Lit(ref lit) = ex.node {
                 use syntax::ast::{LitIntType, LitKind};
+                if let LitKind::Int(n, _) = lit.node {
+                    if cast_to.is_fp() {
+                        let from_nbits = 128 - n.leading_zeros();
+                        let to_nbits = fp_ty_mantissa_nbits(cast_to);
+                        if from_nbits != 0 && to_nbits != 0 && from_nbits <= to_nbits {
+                            span_lint_and_sugg(
+                                cx,
+                                UNNECESSARY_CAST,
+                                expr.span,
+                                &format!("casting integer literal to {} is unnecessary", cast_to),
+                                "try",
+                                format!("{}_{}", n, cast_to),
+                                Applicability::MachineApplicable,
+                            );
+                            return;
+                        }
+                    }
+                }
                 match lit.node {
                     LitKind::Int(_, LitIntType::Unsuffixed) | LitKind::FloatUnsuffixed(_) => {},
                     _ => {
diff --git a/tests/ui/cast.rs b/tests/ui/cast.rs
index c248b5bf598..ab5f9bb4e9d 100644
--- a/tests/ui/cast.rs
+++ b/tests/ui/cast.rs
@@ -8,12 +8,16 @@
 #[allow(clippy::no_effect, clippy::unnecessary_operation)]
 fn main() {
     // Test clippy::cast_precision_loss
-    1i32 as f32;
-    1i64 as f32;
-    1i64 as f64;
-    1u32 as f32;
-    1u64 as f32;
-    1u64 as f64;
+    let x0 = 1i32;
+    x0 as f32;
+    let x1 = 1i64;
+    x1 as f32;
+    x1 as f64;
+    let x2 = 1u32;
+    x2 as f32;
+    let x3 = 1u64;
+    x3 as f32;
+    x3 as f64;
     // Test clippy::cast_possible_truncation
     1f32 as i32;
     1f32 as u32;
@@ -49,6 +53,10 @@ fn main() {
     1f32 as f32;
     false as bool;
     &1i32 as &i32;
+    // casting integer literal to float is unnecessary
+    100 as f32;
+    100 as f64;
+    100_i32 as f64;
     // Should not trigger
     #[rustfmt::skip]
     let v = vec!(1);
diff --git a/tests/ui/cast.stderr b/tests/ui/cast.stderr
index c01393793f1..9923d35832e 100644
--- a/tests/ui/cast.stderr
+++ b/tests/ui/cast.stderr
@@ -1,43 +1,43 @@
 error: casting i32 to f32 causes a loss of precision (i32 is 32 bits wide, but f32's mantissa is only 23 bits wide)
-  --> $DIR/cast.rs:11:5
+  --> $DIR/cast.rs:12:5
    |
-LL |     1i32 as f32;
-   |     ^^^^^^^^^^^
+LL |     x0 as f32;
+   |     ^^^^^^^^^
    |
    = note: `-D clippy::cast-precision-loss` implied by `-D warnings`
 
 error: casting i64 to f32 causes a loss of precision (i64 is 64 bits wide, but f32's mantissa is only 23 bits wide)
-  --> $DIR/cast.rs:12:5
+  --> $DIR/cast.rs:14:5
    |
-LL |     1i64 as f32;
-   |     ^^^^^^^^^^^
+LL |     x1 as f32;
+   |     ^^^^^^^^^
 
 error: casting i64 to f64 causes a loss of precision (i64 is 64 bits wide, but f64's mantissa is only 52 bits wide)
-  --> $DIR/cast.rs:13:5
+  --> $DIR/cast.rs:15:5
    |
-LL |     1i64 as f64;
-   |     ^^^^^^^^^^^
+LL |     x1 as f64;
+   |     ^^^^^^^^^
 
 error: casting u32 to f32 causes a loss of precision (u32 is 32 bits wide, but f32's mantissa is only 23 bits wide)
-  --> $DIR/cast.rs:14:5
+  --> $DIR/cast.rs:17:5
    |
-LL |     1u32 as f32;
-   |     ^^^^^^^^^^^
+LL |     x2 as f32;
+   |     ^^^^^^^^^
 
 error: casting u64 to f32 causes a loss of precision (u64 is 64 bits wide, but f32's mantissa is only 23 bits wide)
-  --> $DIR/cast.rs:15:5
+  --> $DIR/cast.rs:19:5
    |
-LL |     1u64 as f32;
-   |     ^^^^^^^^^^^
+LL |     x3 as f32;
+   |     ^^^^^^^^^
 
 error: casting u64 to f64 causes a loss of precision (u64 is 64 bits wide, but f64's mantissa is only 52 bits wide)
-  --> $DIR/cast.rs:16:5
+  --> $DIR/cast.rs:20:5
    |
-LL |     1u64 as f64;
-   |     ^^^^^^^^^^^
+LL |     x3 as f64;
+   |     ^^^^^^^^^
 
 error: casting f32 to i32 may truncate the value
-  --> $DIR/cast.rs:18:5
+  --> $DIR/cast.rs:22:5
    |
 LL |     1f32 as i32;
    |     ^^^^^^^^^^^
@@ -45,13 +45,13 @@ LL |     1f32 as i32;
    = note: `-D clippy::cast-possible-truncation` implied by `-D warnings`
 
 error: casting f32 to u32 may truncate the value
-  --> $DIR/cast.rs:19:5
+  --> $DIR/cast.rs:23:5
    |
 LL |     1f32 as u32;
    |     ^^^^^^^^^^^
 
 error: casting f32 to u32 may lose the sign of the value
-  --> $DIR/cast.rs:19:5
+  --> $DIR/cast.rs:23:5
    |
 LL |     1f32 as u32;
    |     ^^^^^^^^^^^
@@ -59,43 +59,43 @@ LL |     1f32 as u32;
    = note: `-D clippy::cast-sign-loss` implied by `-D warnings`
 
 error: casting f64 to f32 may truncate the value
-  --> $DIR/cast.rs:20:5
+  --> $DIR/cast.rs:24:5
    |
 LL |     1f64 as f32;
    |     ^^^^^^^^^^^
 
 error: casting i32 to i8 may truncate the value
-  --> $DIR/cast.rs:21:5
+  --> $DIR/cast.rs:25:5
    |
 LL |     1i32 as i8;
    |     ^^^^^^^^^^
 
 error: casting i32 to u8 may truncate the value
-  --> $DIR/cast.rs:22:5
+  --> $DIR/cast.rs:26:5
    |
 LL |     1i32 as u8;
    |     ^^^^^^^^^^
 
 error: casting f64 to isize may truncate the value
-  --> $DIR/cast.rs:23:5
+  --> $DIR/cast.rs:27:5
    |
 LL |     1f64 as isize;
    |     ^^^^^^^^^^^^^
 
 error: casting f64 to usize may truncate the value
-  --> $DIR/cast.rs:24:5
+  --> $DIR/cast.rs:28:5
    |
 LL |     1f64 as usize;
    |     ^^^^^^^^^^^^^
 
 error: casting f64 to usize may lose the sign of the value
-  --> $DIR/cast.rs:24:5
+  --> $DIR/cast.rs:28:5
    |
 LL |     1f64 as usize;
    |     ^^^^^^^^^^^^^
 
 error: casting u8 to i8 may wrap around the value
-  --> $DIR/cast.rs:26:5
+  --> $DIR/cast.rs:30:5
    |
 LL |     1u8 as i8;
    |     ^^^^^^^^^
@@ -103,31 +103,31 @@ LL |     1u8 as i8;
    = note: `-D clippy::cast-possible-wrap` implied by `-D warnings`
 
 error: casting u16 to i16 may wrap around the value
-  --> $DIR/cast.rs:27:5
+  --> $DIR/cast.rs:31:5
    |
 LL |     1u16 as i16;
    |     ^^^^^^^^^^^
 
 error: casting u32 to i32 may wrap around the value
-  --> $DIR/cast.rs:28:5
+  --> $DIR/cast.rs:32:5
    |
 LL |     1u32 as i32;
    |     ^^^^^^^^^^^
 
 error: casting u64 to i64 may wrap around the value
-  --> $DIR/cast.rs:29:5
+  --> $DIR/cast.rs:33:5
    |
 LL |     1u64 as i64;
    |     ^^^^^^^^^^^
 
 error: casting usize to isize may wrap around the value
-  --> $DIR/cast.rs:30:5
+  --> $DIR/cast.rs:34:5
    |
 LL |     1usize as isize;
    |     ^^^^^^^^^^^^^^^
 
 error: casting f32 to f64 may become silently lossy if types change
-  --> $DIR/cast.rs:32:5
+  --> $DIR/cast.rs:36:5
    |
 LL |     1.0f32 as f64;
    |     ^^^^^^^^^^^^^ help: try: `f64::from(1.0f32)`
@@ -135,25 +135,25 @@ LL |     1.0f32 as f64;
    = note: `-D clippy::cast-lossless` implied by `-D warnings`
 
 error: casting u8 to u16 may become silently lossy if types change
-  --> $DIR/cast.rs:34:5
+  --> $DIR/cast.rs:38:5
    |
 LL |     (1u8 + 1u8) as u16;
    |     ^^^^^^^^^^^^^^^^^^ help: try: `u16::from(1u8 + 1u8)`
 
 error: casting i32 to u32 may lose the sign of the value
-  --> $DIR/cast.rs:37:5
+  --> $DIR/cast.rs:41:5
    |
 LL |     -1i32 as u32;
    |     ^^^^^^^^^^^^
 
 error: casting isize to usize may lose the sign of the value
-  --> $DIR/cast.rs:39:5
+  --> $DIR/cast.rs:43:5
    |
 LL |     -1isize as usize;
    |     ^^^^^^^^^^^^^^^^
 
 error: casting to the same type is unnecessary (`i32` -> `i32`)
-  --> $DIR/cast.rs:48:5
+  --> $DIR/cast.rs:52:5
    |
 LL |     1i32 as i32;
    |     ^^^^^^^^^^^
@@ -161,16 +161,34 @@ LL |     1i32 as i32;
    = note: `-D clippy::unnecessary-cast` implied by `-D warnings`
 
 error: casting to the same type is unnecessary (`f32` -> `f32`)
-  --> $DIR/cast.rs:49:5
+  --> $DIR/cast.rs:53:5
    |
 LL |     1f32 as f32;
    |     ^^^^^^^^^^^
 
 error: casting to the same type is unnecessary (`bool` -> `bool`)
-  --> $DIR/cast.rs:50:5
+  --> $DIR/cast.rs:54:5
    |
 LL |     false as bool;
    |     ^^^^^^^^^^^^^
 
-error: aborting due to 27 previous errors
+error: casting integer literal to f32 is unnecessary
+  --> $DIR/cast.rs:57:5
+   |
+LL |     100 as f32;
+   |     ^^^^^^^^^^ help: try: `100_f32`
+
+error: casting integer literal to f64 is unnecessary
+  --> $DIR/cast.rs:58:5
+   |
+LL |     100 as f64;
+   |     ^^^^^^^^^^ help: try: `100_f64`
+
+error: casting integer literal to f64 is unnecessary
+  --> $DIR/cast.rs:59:5
+   |
+LL |     100_i32 as f64;
+   |     ^^^^^^^^^^^^^^ help: try: `100_f64`
+
+error: aborting due to 30 previous errors
 
diff --git a/tests/ui/cast_lossless_float.fixed b/tests/ui/cast_lossless_float.fixed
index cc3b007ee5d..4df0faf0b3e 100644
--- a/tests/ui/cast_lossless_float.fixed
+++ b/tests/ui/cast_lossless_float.fixed
@@ -5,16 +5,22 @@
 
 fn main() {
     // Test clippy::cast_lossless with casts to floating-point types
-    f32::from(1i8);
-    f64::from(1i8);
-    f32::from(1u8);
-    f64::from(1u8);
-    f32::from(1i16);
-    f64::from(1i16);
-    f32::from(1u16);
-    f64::from(1u16);
-    f64::from(1i32);
-    f64::from(1u32);
+    let x0 = 1i8;
+    f32::from(x0);
+    f64::from(x0);
+    let x1 = 1u8;
+    f32::from(x1);
+    f64::from(x1);
+    let x2 = 1i16;
+    f32::from(x2);
+    f64::from(x2);
+    let x3 = 1u16;
+    f32::from(x3);
+    f64::from(x3);
+    let x4 = 1i32;
+    f64::from(x4);
+    let x5 = 1u32;
+    f64::from(x5);
 }
 
 // The lint would suggest using `f64::from(input)` here but the `XX::from` function is not const,
diff --git a/tests/ui/cast_lossless_float.rs b/tests/ui/cast_lossless_float.rs
index 6684afa0ede..a8d5ed2508c 100644
--- a/tests/ui/cast_lossless_float.rs
+++ b/tests/ui/cast_lossless_float.rs
@@ -5,16 +5,22 @@
 
 fn main() {
     // Test clippy::cast_lossless with casts to floating-point types
-    1i8 as f32;
-    1i8 as f64;
-    1u8 as f32;
-    1u8 as f64;
-    1i16 as f32;
-    1i16 as f64;
-    1u16 as f32;
-    1u16 as f64;
-    1i32 as f64;
-    1u32 as f64;
+    let x0 = 1i8;
+    x0 as f32;
+    x0 as f64;
+    let x1 = 1u8;
+    x1 as f32;
+    x1 as f64;
+    let x2 = 1i16;
+    x2 as f32;
+    x2 as f64;
+    let x3 = 1u16;
+    x3 as f32;
+    x3 as f64;
+    let x4 = 1i32;
+    x4 as f64;
+    let x5 = 1u32;
+    x5 as f64;
 }
 
 // The lint would suggest using `f64::from(input)` here but the `XX::from` function is not const,
diff --git a/tests/ui/cast_lossless_float.stderr b/tests/ui/cast_lossless_float.stderr
index 691ce72399e..942c3d22bdc 100644
--- a/tests/ui/cast_lossless_float.stderr
+++ b/tests/ui/cast_lossless_float.stderr
@@ -1,64 +1,64 @@
 error: casting i8 to f32 may become silently lossy if types change
-  --> $DIR/cast_lossless_float.rs:8:5
+  --> $DIR/cast_lossless_float.rs:9:5
    |
-LL |     1i8 as f32;
-   |     ^^^^^^^^^^ help: try: `f32::from(1i8)`
+LL |     x0 as f32;
+   |     ^^^^^^^^^ help: try: `f32::from(x0)`
    |
    = note: `-D clippy::cast-lossless` implied by `-D warnings`
 
 error: casting i8 to f64 may become silently lossy if types change
-  --> $DIR/cast_lossless_float.rs:9:5
+  --> $DIR/cast_lossless_float.rs:10:5
    |
-LL |     1i8 as f64;
-   |     ^^^^^^^^^^ help: try: `f64::from(1i8)`
+LL |     x0 as f64;
+   |     ^^^^^^^^^ help: try: `f64::from(x0)`
 
 error: casting u8 to f32 may become silently lossy if types change
-  --> $DIR/cast_lossless_float.rs:10:5
+  --> $DIR/cast_lossless_float.rs:12:5
    |
-LL |     1u8 as f32;
-   |     ^^^^^^^^^^ help: try: `f32::from(1u8)`
+LL |     x1 as f32;
+   |     ^^^^^^^^^ help: try: `f32::from(x1)`
 
 error: casting u8 to f64 may become silently lossy if types change
-  --> $DIR/cast_lossless_float.rs:11:5
+  --> $DIR/cast_lossless_float.rs:13:5
    |
-LL |     1u8 as f64;
-   |     ^^^^^^^^^^ help: try: `f64::from(1u8)`
+LL |     x1 as f64;
+   |     ^^^^^^^^^ help: try: `f64::from(x1)`
 
 error: casting i16 to f32 may become silently lossy if types change
-  --> $DIR/cast_lossless_float.rs:12:5
+  --> $DIR/cast_lossless_float.rs:15:5
    |
-LL |     1i16 as f32;
-   |     ^^^^^^^^^^^ help: try: `f32::from(1i16)`
+LL |     x2 as f32;
+   |     ^^^^^^^^^ help: try: `f32::from(x2)`
 
 error: casting i16 to f64 may become silently lossy if types change
-  --> $DIR/cast_lossless_float.rs:13:5
+  --> $DIR/cast_lossless_float.rs:16:5
    |
-LL |     1i16 as f64;
-   |     ^^^^^^^^^^^ help: try: `f64::from(1i16)`
+LL |     x2 as f64;
+   |     ^^^^^^^^^ help: try: `f64::from(x2)`
 
 error: casting u16 to f32 may become silently lossy if types change
-  --> $DIR/cast_lossless_float.rs:14:5
+  --> $DIR/cast_lossless_float.rs:18:5
    |
-LL |     1u16 as f32;
-   |     ^^^^^^^^^^^ help: try: `f32::from(1u16)`
+LL |     x3 as f32;
+   |     ^^^^^^^^^ help: try: `f32::from(x3)`
 
 error: casting u16 to f64 may become silently lossy if types change
-  --> $DIR/cast_lossless_float.rs:15:5
+  --> $DIR/cast_lossless_float.rs:19:5
    |
-LL |     1u16 as f64;
-   |     ^^^^^^^^^^^ help: try: `f64::from(1u16)`
+LL |     x3 as f64;
+   |     ^^^^^^^^^ help: try: `f64::from(x3)`
 
 error: casting i32 to f64 may become silently lossy if types change
-  --> $DIR/cast_lossless_float.rs:16:5
+  --> $DIR/cast_lossless_float.rs:21:5
    |
-LL |     1i32 as f64;
-   |     ^^^^^^^^^^^ help: try: `f64::from(1i32)`
+LL |     x4 as f64;
+   |     ^^^^^^^^^ help: try: `f64::from(x4)`
 
 error: casting u32 to f64 may become silently lossy if types change
-  --> $DIR/cast_lossless_float.rs:17:5
+  --> $DIR/cast_lossless_float.rs:23:5
    |
-LL |     1u32 as f64;
-   |     ^^^^^^^^^^^ help: try: `f64::from(1u32)`
+LL |     x5 as f64;
+   |     ^^^^^^^^^ help: try: `f64::from(x5)`
 
 error: aborting due to 10 previous errors
 
diff --git a/tests/ui/cast_size.rs b/tests/ui/cast_size.rs
index fde178b1874..611e5a85572 100644
--- a/tests/ui/cast_size.rs
+++ b/tests/ui/cast_size.rs
@@ -9,10 +9,12 @@
 fn main() {
     // Casting from *size
     1isize as i8;
-    1isize as f64;
-    1usize as f64;
-    1isize as f32;
-    1usize as f32;
+    let x0 = 1isize;
+    let x1 = 1usize;
+    x0 as f64;
+    x1 as f64;
+    x0 as f32;
+    x1 as f32;
     1isize as i32;
     1isize as u32;
     1usize as u32;
@@ -26,4 +28,7 @@ fn main() {
     1u32 as usize; // Should not trigger any lint
     1i32 as isize; // Neither should this
     1i32 as usize;
+    // Big integer literal to float
+    999_999_999 as f32;
+    9_999_999_999_999_999usize as f64;
 }
diff --git a/tests/ui/cast_size.stderr b/tests/ui/cast_size.stderr
index a77aafaf11d..735e522b40d 100644
--- a/tests/ui/cast_size.stderr
+++ b/tests/ui/cast_size.stderr
@@ -7,57 +7,57 @@ LL |     1isize as i8;
    = note: `-D clippy::cast-possible-truncation` implied by `-D warnings`
 
 error: casting isize to f64 causes a loss of precision on targets with 64-bit wide pointers (isize is 64 bits wide, but f64's mantissa is only 52 bits wide)
-  --> $DIR/cast_size.rs:12:5
+  --> $DIR/cast_size.rs:14:5
    |
-LL |     1isize as f64;
-   |     ^^^^^^^^^^^^^
+LL |     x0 as f64;
+   |     ^^^^^^^^^
    |
    = note: `-D clippy::cast-precision-loss` implied by `-D warnings`
 
 error: casting usize to f64 causes a loss of precision on targets with 64-bit wide pointers (usize is 64 bits wide, but f64's mantissa is only 52 bits wide)
-  --> $DIR/cast_size.rs:13:5
+  --> $DIR/cast_size.rs:15:5
    |
-LL |     1usize as f64;
-   |     ^^^^^^^^^^^^^
+LL |     x1 as f64;
+   |     ^^^^^^^^^
 
 error: casting isize to f32 causes a loss of precision (isize is 32 or 64 bits wide, but f32's mantissa is only 23 bits wide)
-  --> $DIR/cast_size.rs:14:5
+  --> $DIR/cast_size.rs:16:5
    |
-LL |     1isize as f32;
-   |     ^^^^^^^^^^^^^
+LL |     x0 as f32;
+   |     ^^^^^^^^^
 
 error: casting usize to f32 causes a loss of precision (usize is 32 or 64 bits wide, but f32's mantissa is only 23 bits wide)
-  --> $DIR/cast_size.rs:15:5
+  --> $DIR/cast_size.rs:17:5
    |
-LL |     1usize as f32;
-   |     ^^^^^^^^^^^^^
+LL |     x1 as f32;
+   |     ^^^^^^^^^
 
 error: casting isize to i32 may truncate the value on targets with 64-bit wide pointers
-  --> $DIR/cast_size.rs:16:5
+  --> $DIR/cast_size.rs:18:5
    |
 LL |     1isize as i32;
    |     ^^^^^^^^^^^^^
 
 error: casting isize to u32 may truncate the value on targets with 64-bit wide pointers
-  --> $DIR/cast_size.rs:17:5
+  --> $DIR/cast_size.rs:19:5
    |
 LL |     1isize as u32;
    |     ^^^^^^^^^^^^^
 
 error: casting usize to u32 may truncate the value on targets with 64-bit wide pointers
-  --> $DIR/cast_size.rs:18:5
+  --> $DIR/cast_size.rs:20:5
    |
 LL |     1usize as u32;
    |     ^^^^^^^^^^^^^
 
 error: casting usize to i32 may truncate the value on targets with 64-bit wide pointers
-  --> $DIR/cast_size.rs:19:5
+  --> $DIR/cast_size.rs:21:5
    |
 LL |     1usize as i32;
    |     ^^^^^^^^^^^^^
 
 error: casting usize to i32 may wrap around the value on targets with 32-bit wide pointers
-  --> $DIR/cast_size.rs:19:5
+  --> $DIR/cast_size.rs:21:5
    |
 LL |     1usize as i32;
    |     ^^^^^^^^^^^^^
@@ -65,40 +65,52 @@ LL |     1usize as i32;
    = note: `-D clippy::cast-possible-wrap` implied by `-D warnings`
 
 error: casting i64 to isize may truncate the value on targets with 32-bit wide pointers
-  --> $DIR/cast_size.rs:21:5
+  --> $DIR/cast_size.rs:23:5
    |
 LL |     1i64 as isize;
    |     ^^^^^^^^^^^^^
 
 error: casting i64 to usize may truncate the value on targets with 32-bit wide pointers
-  --> $DIR/cast_size.rs:22:5
+  --> $DIR/cast_size.rs:24:5
    |
 LL |     1i64 as usize;
    |     ^^^^^^^^^^^^^
 
 error: casting u64 to isize may truncate the value on targets with 32-bit wide pointers
-  --> $DIR/cast_size.rs:23:5
+  --> $DIR/cast_size.rs:25:5
    |
 LL |     1u64 as isize;
    |     ^^^^^^^^^^^^^
 
 error: casting u64 to isize may wrap around the value on targets with 64-bit wide pointers
-  --> $DIR/cast_size.rs:23:5
+  --> $DIR/cast_size.rs:25:5
    |
 LL |     1u64 as isize;
    |     ^^^^^^^^^^^^^
 
 error: casting u64 to usize may truncate the value on targets with 32-bit wide pointers
-  --> $DIR/cast_size.rs:24:5
+  --> $DIR/cast_size.rs:26:5
    |
 LL |     1u64 as usize;
    |     ^^^^^^^^^^^^^
 
 error: casting u32 to isize may wrap around the value on targets with 32-bit wide pointers
-  --> $DIR/cast_size.rs:25:5
+  --> $DIR/cast_size.rs:27:5
    |
 LL |     1u32 as isize;
    |     ^^^^^^^^^^^^^
 
-error: aborting due to 16 previous errors
+error: casting i32 to f32 causes a loss of precision (i32 is 32 bits wide, but f32's mantissa is only 23 bits wide)
+  --> $DIR/cast_size.rs:32:5
+   |
+LL |     999_999_999 as f32;
+   |     ^^^^^^^^^^^^^^^^^^
+
+error: casting usize to f64 causes a loss of precision on targets with 64-bit wide pointers (usize is 64 bits wide, but f64's mantissa is only 52 bits wide)
+  --> $DIR/cast_size.rs:33:5
+   |
+LL |     9_999_999_999_999_999usize as f64;
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 18 previous errors
 
diff --git a/tests/ui/float_cmp_const.rs b/tests/ui/float_cmp_const.rs
index 887275c5e88..17ad274bd6d 100644
--- a/tests/ui/float_cmp_const.rs
+++ b/tests/ui/float_cmp_const.rs
@@ -19,7 +19,8 @@ fn main() {
     TWO == ONE;
     TWO != ONE;
     ONE + ONE == TWO;
-    1 as f32 == ONE;
+    let x = 1;
+    x as f32 == ONE;
 
     let v = 0.9;
     v == ONE;
diff --git a/tests/ui/float_cmp_const.stderr b/tests/ui/float_cmp_const.stderr
index 9ec921e536a..0c746e24d12 100644
--- a/tests/ui/float_cmp_const.stderr
+++ b/tests/ui/float_cmp_const.stderr
@@ -48,37 +48,37 @@ LL |     ONE + ONE == TWO;
    |     ^^^^^^^^^^^^^^^^
 
 error: strict comparison of f32 or f64 constant
-  --> $DIR/float_cmp_const.rs:22:5
+  --> $DIR/float_cmp_const.rs:23:5
    |
-LL |     1 as f32 == ONE;
-   |     ^^^^^^^^^^^^^^^ help: consider comparing them within some error: `(1 as f32 - ONE).abs() < error`
+LL |     x as f32 == ONE;
+   |     ^^^^^^^^^^^^^^^ help: consider comparing them within some error: `(x as f32 - ONE).abs() < error`
    |
 note: std::f32::EPSILON and std::f64::EPSILON are available.
-  --> $DIR/float_cmp_const.rs:22:5
+  --> $DIR/float_cmp_const.rs:23:5
    |
-LL |     1 as f32 == ONE;
+LL |     x as f32 == ONE;
    |     ^^^^^^^^^^^^^^^
 
 error: strict comparison of f32 or f64 constant
-  --> $DIR/float_cmp_const.rs:25:5
+  --> $DIR/float_cmp_const.rs:26:5
    |
 LL |     v == ONE;
    |     ^^^^^^^^ help: consider comparing them within some error: `(v - ONE).abs() < error`
    |
 note: std::f32::EPSILON and std::f64::EPSILON are available.
-  --> $DIR/float_cmp_const.rs:25:5
+  --> $DIR/float_cmp_const.rs:26:5
    |
 LL |     v == ONE;
    |     ^^^^^^^^
 
 error: strict comparison of f32 or f64 constant
-  --> $DIR/float_cmp_const.rs:26:5
+  --> $DIR/float_cmp_const.rs:27:5
    |
 LL |     v != ONE;
    |     ^^^^^^^^ help: consider comparing them within some error: `(v - ONE).abs() < error`
    |
 note: std::f32::EPSILON and std::f64::EPSILON are available.
-  --> $DIR/float_cmp_const.rs:26:5
+  --> $DIR/float_cmp_const.rs:27:5
    |
 LL |     v != ONE;
    |     ^^^^^^^^