Ignore more type aliases in unnecessary_cast

This commit is contained in:
Centri3 2023-06-13 06:51:56 -05:00
parent da56c3502a
commit 357e80ea0d
5 changed files with 166 additions and 45 deletions

View File

@ -1,15 +1,17 @@
use clippy_utils::diagnostics::span_lint_and_sugg; use clippy_utils::diagnostics::span_lint_and_sugg;
use clippy_utils::numeric_literal::NumericLiteral; use clippy_utils::numeric_literal::NumericLiteral;
use clippy_utils::source::snippet_opt; use clippy_utils::source::snippet_opt;
use clippy_utils::{get_parent_expr, is_hir_ty_cfg_dependant, is_ty_alias, path_to_local}; use clippy_utils::visitors::{for_each_expr, Visitable};
use clippy_utils::{get_parent_expr, get_parent_node, is_hir_ty_cfg_dependant, is_ty_alias, path_to_local};
use if_chain::if_chain; use if_chain::if_chain;
use rustc_ast::{LitFloatType, LitIntType, LitKind}; use rustc_ast::{LitFloatType, LitIntType, LitKind};
use rustc_errors::Applicability; use rustc_errors::Applicability;
use rustc_hir::def::Res; use rustc_hir::def::{DefKind, Res};
use rustc_hir::{Expr, ExprKind, Lit, Node, Path, QPath, TyKind, UnOp}; use rustc_hir::{Expr, ExprKind, Lit, Node, Path, QPath, TyKind, UnOp};
use rustc_lint::{LateContext, LintContext}; use rustc_lint::{LateContext, LintContext};
use rustc_middle::lint::in_external_macro; use rustc_middle::lint::in_external_macro;
use rustc_middle::ty::{self, FloatTy, InferTy, Ty}; use rustc_middle::ty::{self, FloatTy, InferTy, Ty};
use std::ops::ControlFlow;
use super::UNNECESSARY_CAST; use super::UNNECESSARY_CAST;
@ -59,7 +61,7 @@ pub(super) fn check<'tcx>(
} }
} }
// skip cast of local to type alias // skip cast of local that is a type alias
if let ExprKind::Cast(inner, ..) = expr.kind if let ExprKind::Cast(inner, ..) = expr.kind
&& let ExprKind::Path(qpath) = inner.kind && let ExprKind::Path(qpath) = inner.kind
&& let QPath::Resolved(None, Path { res, .. }) = qpath && let QPath::Resolved(None, Path { res, .. }) = qpath
@ -83,6 +85,11 @@ pub(super) fn check<'tcx>(
} }
} }
// skip cast of fn call that returns type alias
if let ExprKind::Cast(inner, ..) = expr.kind && is_cast_from_ty_alias(cx, inner, cast_from) {
return false;
}
// skip cast to non-primitive type // skip cast to non-primitive type
if_chain! { if_chain! {
if let ExprKind::Cast(_, cast_to) = expr.kind; if let ExprKind::Cast(_, cast_to) = expr.kind;
@ -223,3 +230,61 @@ fn fp_ty_mantissa_nbits(typ: Ty<'_>) -> u32 {
_ => 0, _ => 0,
} }
} }
/// Finds whether an `Expr` returns a type alias.
///
/// TODO: Maybe we should move this to `clippy_utils` so others won't need to go down this dark,
/// dark path reimplementing this (or something similar).
fn is_cast_from_ty_alias<'tcx>(cx: &LateContext<'tcx>, expr: impl Visitable<'tcx>, cast_from: Ty<'tcx>) -> bool {
for_each_expr(expr, |expr| {
// Calls are a `Path`, and usage of locals are a `Path`. So, this checks
// - call() as i32
// - local as i32
if let ExprKind::Path(qpath) = expr.kind {
let res = cx.qpath_res(&qpath, expr.hir_id);
// Function call
if let Res::Def(DefKind::Fn, def_id) = res {
let Some(snippet) = snippet_opt(cx, cx.tcx.def_span(def_id)) else {
return ControlFlow::Continue(());
};
// This is the worst part of this entire function. This is the only way I know of to
// check whether a function returns a type alias. Sure, you can get the return type
// from a function in the current crate as an hir ty, but how do you get it for
// external functions?? Simple: It's impossible. So, we check whether a part of the
// function's declaration snippet is exactly equal to the `Ty`. That way, we can
// see whether it's a type alias.
//
// Will this work for more complex types? Probably not!
if !snippet
.split("->")
.skip(0)
.map(|s| {
s.trim() == cast_from.to_string()
|| s.split("where").any(|ty| ty.trim() == cast_from.to_string())
})
.any(|a| a)
{
return ControlFlow::Break(());
}
// Local usage
} else if let Res::Local(hir_id) = res
&& let Some(parent) = get_parent_node(cx.tcx, hir_id)
&& let Node::Local(l) = parent
{
if let Some(e) = l.init && is_cast_from_ty_alias(cx, e, cast_from) {
return ControlFlow::Break::<()>(());
}
if let Some(ty) = l.ty
&& let TyKind::Path(qpath) = ty.kind
&& is_ty_alias(&qpath)
{
return ControlFlow::Break::<()>(());
}
}
}
ControlFlow::Continue(())
})
.is_some()
}

View File

@ -0,0 +1,10 @@
#![allow(nonstandard_style)]
#![allow(clippy::missing_safety_doc, unused)]
type pid_t = i32;
pub unsafe fn getpid() -> pid_t {
pid_t::from(0)
}
pub fn getpid_SAFE_TRUTH() -> pid_t {
unsafe { getpid() }
}

View File

@ -1,13 +1,17 @@
//@run-rustfix //@run-rustfix
//@aux-build:extern_fake_libc.rs
#![warn(clippy::unnecessary_cast)] #![warn(clippy::unnecessary_cast)]
#![allow( #![allow(
unused,
clippy::borrow_as_ptr, clippy::borrow_as_ptr,
clippy::no_effect, clippy::no_effect,
clippy::nonstandard_macro_braces, clippy::nonstandard_macro_braces,
clippy::unnecessary_operation clippy::unnecessary_operation,
nonstandard_style,
unused
)] )]
extern crate extern_fake_libc;
type PtrConstU8 = *const u8; type PtrConstU8 = *const u8;
type PtrMutU8 = *mut u8; type PtrMutU8 = *mut u8;
@ -19,6 +23,21 @@ fn uwu<T, U>(ptr: *const T) -> *const U {
ptr as *const U ptr as *const U
} }
mod fake_libc {
type pid_t = i32;
pub unsafe fn getpid() -> pid_t {
pid_t::from(0)
}
// Make sure a where clause does not break it
pub fn getpid_SAFE_TRUTH<T: Clone>(t: &T) -> pid_t
where
T: Clone,
{
t;
unsafe { getpid() }
}
}
#[rustfmt::skip] #[rustfmt::skip]
fn main() { fn main() {
// Test cast_unnecessary // Test cast_unnecessary
@ -82,6 +101,10 @@ fn main() {
// or from // or from
let x: I32Alias = 1; let x: I32Alias = 1;
let y = x as u64; let y = x as u64;
fake_libc::getpid_SAFE_TRUTH(&0u32) as i32;
extern_fake_libc::getpid_SAFE_TRUTH() as i32;
let pid = unsafe { fake_libc::getpid() };
pid as i32;
let i8_ptr: *const i8 = &1; let i8_ptr: *const i8 = &1;
let u8_ptr: *const u8 = &1; let u8_ptr: *const u8 = &1;

View File

@ -1,13 +1,17 @@
//@run-rustfix //@run-rustfix
//@aux-build:extern_fake_libc.rs
#![warn(clippy::unnecessary_cast)] #![warn(clippy::unnecessary_cast)]
#![allow( #![allow(
unused,
clippy::borrow_as_ptr, clippy::borrow_as_ptr,
clippy::no_effect, clippy::no_effect,
clippy::nonstandard_macro_braces, clippy::nonstandard_macro_braces,
clippy::unnecessary_operation clippy::unnecessary_operation,
nonstandard_style,
unused
)] )]
extern crate extern_fake_libc;
type PtrConstU8 = *const u8; type PtrConstU8 = *const u8;
type PtrMutU8 = *mut u8; type PtrMutU8 = *mut u8;
@ -19,6 +23,21 @@ fn uwu<T, U>(ptr: *const T) -> *const U {
ptr as *const U ptr as *const U
} }
mod fake_libc {
type pid_t = i32;
pub unsafe fn getpid() -> pid_t {
pid_t::from(0)
}
// Make sure a where clause does not break it
pub fn getpid_SAFE_TRUTH<T: Clone>(t: &T) -> pid_t
where
T: Clone,
{
t;
unsafe { getpid() }
}
}
#[rustfmt::skip] #[rustfmt::skip]
fn main() { fn main() {
// Test cast_unnecessary // Test cast_unnecessary
@ -82,6 +101,10 @@ fn main() {
// or from // or from
let x: I32Alias = 1; let x: I32Alias = 1;
let y = x as u64; let y = x as u64;
fake_libc::getpid_SAFE_TRUTH(&0u32) as i32;
extern_fake_libc::getpid_SAFE_TRUTH() as i32;
let pid = unsafe { fake_libc::getpid() };
pid as i32;
let i8_ptr: *const i8 = &1; let i8_ptr: *const i8 = &1;
let u8_ptr: *const u8 = &1; let u8_ptr: *const u8 = &1;

View File

@ -1,5 +1,5 @@
error: casting raw pointers to the same type and constness is unnecessary (`*const T` -> `*const T`) error: casting raw pointers to the same type and constness is unnecessary (`*const T` -> `*const T`)
--> $DIR/unnecessary_cast.rs:15:5 --> $DIR/unnecessary_cast.rs:19:5
| |
LL | ptr as *const T LL | ptr as *const T
| ^^^^^^^^^^^^^^^ help: try: `ptr` | ^^^^^^^^^^^^^^^ help: try: `ptr`
@ -7,223 +7,223 @@ LL | ptr as *const T
= note: `-D clippy::unnecessary-cast` implied by `-D warnings` = note: `-D clippy::unnecessary-cast` implied by `-D warnings`
error: casting integer literal to `i32` is unnecessary error: casting integer literal to `i32` is unnecessary
--> $DIR/unnecessary_cast.rs:25:5 --> $DIR/unnecessary_cast.rs:44:5
| |
LL | 1i32 as i32; LL | 1i32 as i32;
| ^^^^^^^^^^^ help: try: `1_i32` | ^^^^^^^^^^^ help: try: `1_i32`
error: casting float literal to `f32` is unnecessary error: casting float literal to `f32` is unnecessary
--> $DIR/unnecessary_cast.rs:26:5 --> $DIR/unnecessary_cast.rs:45:5
| |
LL | 1f32 as f32; LL | 1f32 as f32;
| ^^^^^^^^^^^ help: try: `1_f32` | ^^^^^^^^^^^ help: try: `1_f32`
error: casting to the same type is unnecessary (`bool` -> `bool`) error: casting to the same type is unnecessary (`bool` -> `bool`)
--> $DIR/unnecessary_cast.rs:27:5 --> $DIR/unnecessary_cast.rs:46:5
| |
LL | false as bool; LL | false as bool;
| ^^^^^^^^^^^^^ help: try: `false` | ^^^^^^^^^^^^^ help: try: `false`
error: casting integer literal to `i32` is unnecessary error: casting integer literal to `i32` is unnecessary
--> $DIR/unnecessary_cast.rs:30:5 --> $DIR/unnecessary_cast.rs:49:5
| |
LL | -1_i32 as i32; LL | -1_i32 as i32;
| ^^^^^^^^^^^^^ help: try: `-1_i32` | ^^^^^^^^^^^^^ help: try: `-1_i32`
error: casting integer literal to `i32` is unnecessary error: casting integer literal to `i32` is unnecessary
--> $DIR/unnecessary_cast.rs:31:5 --> $DIR/unnecessary_cast.rs:50:5
| |
LL | - 1_i32 as i32; LL | - 1_i32 as i32;
| ^^^^^^^^^^^^^^ help: try: `- 1_i32` | ^^^^^^^^^^^^^^ help: try: `- 1_i32`
error: casting float literal to `f32` is unnecessary error: casting float literal to `f32` is unnecessary
--> $DIR/unnecessary_cast.rs:32:5 --> $DIR/unnecessary_cast.rs:51:5
| |
LL | -1f32 as f32; LL | -1f32 as f32;
| ^^^^^^^^^^^^ help: try: `-1_f32` | ^^^^^^^^^^^^ help: try: `-1_f32`
error: casting integer literal to `i32` is unnecessary error: casting integer literal to `i32` is unnecessary
--> $DIR/unnecessary_cast.rs:33:5 --> $DIR/unnecessary_cast.rs:52:5
| |
LL | 1_i32 as i32; LL | 1_i32 as i32;
| ^^^^^^^^^^^^ help: try: `1_i32` | ^^^^^^^^^^^^ help: try: `1_i32`
error: casting float literal to `f32` is unnecessary error: casting float literal to `f32` is unnecessary
--> $DIR/unnecessary_cast.rs:34:5 --> $DIR/unnecessary_cast.rs:53:5
| |
LL | 1_f32 as f32; LL | 1_f32 as f32;
| ^^^^^^^^^^^^ help: try: `1_f32` | ^^^^^^^^^^^^ help: try: `1_f32`
error: casting raw pointers to the same type and constness is unnecessary (`*const u8` -> `*const u8`) error: casting raw pointers to the same type and constness is unnecessary (`*const u8` -> `*const u8`)
--> $DIR/unnecessary_cast.rs:36:22 --> $DIR/unnecessary_cast.rs:55:22
| |
LL | let _: *mut u8 = [1u8, 2].as_ptr() as *const u8 as *mut u8; LL | let _: *mut u8 = [1u8, 2].as_ptr() as *const u8 as *mut u8;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `[1u8, 2].as_ptr()` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `[1u8, 2].as_ptr()`
error: casting raw pointers to the same type and constness is unnecessary (`*const u8` -> `*const u8`) error: casting raw pointers to the same type and constness is unnecessary (`*const u8` -> `*const u8`)
--> $DIR/unnecessary_cast.rs:38:5 --> $DIR/unnecessary_cast.rs:57:5
| |
LL | [1u8, 2].as_ptr() as *const u8; LL | [1u8, 2].as_ptr() as *const u8;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `[1u8, 2].as_ptr()` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `[1u8, 2].as_ptr()`
error: casting raw pointers to the same type and constness is unnecessary (`*mut u8` -> `*mut u8`) error: casting raw pointers to the same type and constness is unnecessary (`*mut u8` -> `*mut u8`)
--> $DIR/unnecessary_cast.rs:40:5 --> $DIR/unnecessary_cast.rs:59:5
| |
LL | [1u8, 2].as_mut_ptr() as *mut u8; LL | [1u8, 2].as_mut_ptr() as *mut u8;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `[1u8, 2].as_mut_ptr()` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `[1u8, 2].as_mut_ptr()`
error: casting raw pointers to the same type and constness is unnecessary (`*const u32` -> `*const u32`) error: casting raw pointers to the same type and constness is unnecessary (`*const u32` -> `*const u32`)
--> $DIR/unnecessary_cast.rs:51:5 --> $DIR/unnecessary_cast.rs:70:5
| |
LL | owo::<u32>([1u32].as_ptr()) as *const u32; LL | owo::<u32>([1u32].as_ptr()) as *const u32;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `owo::<u32>([1u32].as_ptr())` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `owo::<u32>([1u32].as_ptr())`
error: casting raw pointers to the same type and constness is unnecessary (`*const u8` -> `*const u8`) error: casting raw pointers to the same type and constness is unnecessary (`*const u8` -> `*const u8`)
--> $DIR/unnecessary_cast.rs:52:5 --> $DIR/unnecessary_cast.rs:71:5
| |
LL | uwu::<u32, u8>([1u32].as_ptr()) as *const u8; LL | uwu::<u32, u8>([1u32].as_ptr()) as *const u8;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `uwu::<u32, u8>([1u32].as_ptr())` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `uwu::<u32, u8>([1u32].as_ptr())`
error: casting raw pointers to the same type and constness is unnecessary (`*const u32` -> `*const u32`) error: casting raw pointers to the same type and constness is unnecessary (`*const u32` -> `*const u32`)
--> $DIR/unnecessary_cast.rs:54:5 --> $DIR/unnecessary_cast.rs:73:5
| |
LL | uwu::<u32, u32>([1u32].as_ptr()) as *const u32; LL | uwu::<u32, u32>([1u32].as_ptr()) as *const u32;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `uwu::<u32, u32>([1u32].as_ptr())` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `uwu::<u32, u32>([1u32].as_ptr())`
error: casting integer literal to `f32` is unnecessary error: casting integer literal to `f32` is unnecessary
--> $DIR/unnecessary_cast.rs:116:9 --> $DIR/unnecessary_cast.rs:139:9
| |
LL | 100 as f32; LL | 100 as f32;
| ^^^^^^^^^^ help: try: `100_f32` | ^^^^^^^^^^ help: try: `100_f32`
error: casting integer literal to `f64` is unnecessary error: casting integer literal to `f64` is unnecessary
--> $DIR/unnecessary_cast.rs:117:9 --> $DIR/unnecessary_cast.rs:140:9
| |
LL | 100 as f64; LL | 100 as f64;
| ^^^^^^^^^^ help: try: `100_f64` | ^^^^^^^^^^ help: try: `100_f64`
error: casting integer literal to `f64` is unnecessary error: casting integer literal to `f64` is unnecessary
--> $DIR/unnecessary_cast.rs:118:9 --> $DIR/unnecessary_cast.rs:141:9
| |
LL | 100_i32 as f64; LL | 100_i32 as f64;
| ^^^^^^^^^^^^^^ help: try: `100_f64` | ^^^^^^^^^^^^^^ help: try: `100_f64`
error: casting integer literal to `f32` is unnecessary error: casting integer literal to `f32` is unnecessary
--> $DIR/unnecessary_cast.rs:119:17 --> $DIR/unnecessary_cast.rs:142:17
| |
LL | let _ = -100 as f32; LL | let _ = -100 as f32;
| ^^^^^^^^^^^ help: try: `-100_f32` | ^^^^^^^^^^^ help: try: `-100_f32`
error: casting integer literal to `f64` is unnecessary error: casting integer literal to `f64` is unnecessary
--> $DIR/unnecessary_cast.rs:120:17 --> $DIR/unnecessary_cast.rs:143:17
| |
LL | let _ = -100 as f64; LL | let _ = -100 as f64;
| ^^^^^^^^^^^ help: try: `-100_f64` | ^^^^^^^^^^^ help: try: `-100_f64`
error: casting integer literal to `f64` is unnecessary error: casting integer literal to `f64` is unnecessary
--> $DIR/unnecessary_cast.rs:121:17 --> $DIR/unnecessary_cast.rs:144:17
| |
LL | let _ = -100_i32 as f64; LL | let _ = -100_i32 as f64;
| ^^^^^^^^^^^^^^^ help: try: `-100_f64` | ^^^^^^^^^^^^^^^ help: try: `-100_f64`
error: casting float literal to `f32` is unnecessary error: casting float literal to `f32` is unnecessary
--> $DIR/unnecessary_cast.rs:122:9 --> $DIR/unnecessary_cast.rs:145:9
| |
LL | 100. as f32; LL | 100. as f32;
| ^^^^^^^^^^^ help: try: `100_f32` | ^^^^^^^^^^^ help: try: `100_f32`
error: casting float literal to `f64` is unnecessary error: casting float literal to `f64` is unnecessary
--> $DIR/unnecessary_cast.rs:123:9 --> $DIR/unnecessary_cast.rs:146:9
| |
LL | 100. as f64; LL | 100. as f64;
| ^^^^^^^^^^^ help: try: `100_f64` | ^^^^^^^^^^^ help: try: `100_f64`
error: casting integer literal to `u32` is unnecessary error: casting integer literal to `u32` is unnecessary
--> $DIR/unnecessary_cast.rs:135:9 --> $DIR/unnecessary_cast.rs:158:9
| |
LL | 1 as u32; LL | 1 as u32;
| ^^^^^^^^ help: try: `1_u32` | ^^^^^^^^ help: try: `1_u32`
error: casting integer literal to `i32` is unnecessary error: casting integer literal to `i32` is unnecessary
--> $DIR/unnecessary_cast.rs:136:9 --> $DIR/unnecessary_cast.rs:159:9
| |
LL | 0x10 as i32; LL | 0x10 as i32;
| ^^^^^^^^^^^ help: try: `0x10_i32` | ^^^^^^^^^^^ help: try: `0x10_i32`
error: casting integer literal to `usize` is unnecessary error: casting integer literal to `usize` is unnecessary
--> $DIR/unnecessary_cast.rs:137:9 --> $DIR/unnecessary_cast.rs:160:9
| |
LL | 0b10 as usize; LL | 0b10 as usize;
| ^^^^^^^^^^^^^ help: try: `0b10_usize` | ^^^^^^^^^^^^^ help: try: `0b10_usize`
error: casting integer literal to `u16` is unnecessary error: casting integer literal to `u16` is unnecessary
--> $DIR/unnecessary_cast.rs:138:9 --> $DIR/unnecessary_cast.rs:161:9
| |
LL | 0o73 as u16; LL | 0o73 as u16;
| ^^^^^^^^^^^ help: try: `0o73_u16` | ^^^^^^^^^^^ help: try: `0o73_u16`
error: casting integer literal to `u32` is unnecessary error: casting integer literal to `u32` is unnecessary
--> $DIR/unnecessary_cast.rs:139:9 --> $DIR/unnecessary_cast.rs:162:9
| |
LL | 1_000_000_000 as u32; LL | 1_000_000_000 as u32;
| ^^^^^^^^^^^^^^^^^^^^ help: try: `1_000_000_000_u32` | ^^^^^^^^^^^^^^^^^^^^ help: try: `1_000_000_000_u32`
error: casting float literal to `f64` is unnecessary error: casting float literal to `f64` is unnecessary
--> $DIR/unnecessary_cast.rs:141:9 --> $DIR/unnecessary_cast.rs:164:9
| |
LL | 1.0 as f64; LL | 1.0 as f64;
| ^^^^^^^^^^ help: try: `1.0_f64` | ^^^^^^^^^^ help: try: `1.0_f64`
error: casting float literal to `f32` is unnecessary error: casting float literal to `f32` is unnecessary
--> $DIR/unnecessary_cast.rs:142:9 --> $DIR/unnecessary_cast.rs:165:9
| |
LL | 0.5 as f32; LL | 0.5 as f32;
| ^^^^^^^^^^ help: try: `0.5_f32` | ^^^^^^^^^^ help: try: `0.5_f32`
error: casting integer literal to `i32` is unnecessary error: casting integer literal to `i32` is unnecessary
--> $DIR/unnecessary_cast.rs:146:17 --> $DIR/unnecessary_cast.rs:169:17
| |
LL | let _ = -1 as i32; LL | let _ = -1 as i32;
| ^^^^^^^^^ help: try: `-1_i32` | ^^^^^^^^^ help: try: `-1_i32`
error: casting float literal to `f32` is unnecessary error: casting float literal to `f32` is unnecessary
--> $DIR/unnecessary_cast.rs:147:17 --> $DIR/unnecessary_cast.rs:170:17
| |
LL | let _ = -1.0 as f32; LL | let _ = -1.0 as f32;
| ^^^^^^^^^^^ help: try: `-1.0_f32` | ^^^^^^^^^^^ help: try: `-1.0_f32`
error: casting to the same type is unnecessary (`i32` -> `i32`) error: casting to the same type is unnecessary (`i32` -> `i32`)
--> $DIR/unnecessary_cast.rs:153:18 --> $DIR/unnecessary_cast.rs:176:18
| |
LL | let _ = &(x as i32); LL | let _ = &(x as i32);
| ^^^^^^^^^^ help: try: `{ x }` | ^^^^^^^^^^ help: try: `{ x }`
error: casting integer literal to `i32` is unnecessary error: casting integer literal to `i32` is unnecessary
--> $DIR/unnecessary_cast.rs:159:22 --> $DIR/unnecessary_cast.rs:182:22
| |
LL | let _: i32 = -(1) as i32; LL | let _: i32 = -(1) as i32;
| ^^^^^^^^^^^ help: try: `-1_i32` | ^^^^^^^^^^^ help: try: `-1_i32`
error: casting integer literal to `i64` is unnecessary error: casting integer literal to `i64` is unnecessary
--> $DIR/unnecessary_cast.rs:161:22 --> $DIR/unnecessary_cast.rs:184:22
| |
LL | let _: i64 = -(1) as i64; LL | let _: i64 = -(1) as i64;
| ^^^^^^^^^^^ help: try: `-1_i64` | ^^^^^^^^^^^ help: try: `-1_i64`
error: casting float literal to `f64` is unnecessary error: casting float literal to `f64` is unnecessary
--> $DIR/unnecessary_cast.rs:168:22 --> $DIR/unnecessary_cast.rs:191:22
| |
LL | let _: f64 = (-8.0 as f64).exp(); LL | let _: f64 = (-8.0 as f64).exp();
| ^^^^^^^^^^^^^ help: try: `(-8.0_f64)` | ^^^^^^^^^^^^^ help: try: `(-8.0_f64)`
error: casting float literal to `f64` is unnecessary error: casting float literal to `f64` is unnecessary
--> $DIR/unnecessary_cast.rs:170:23 --> $DIR/unnecessary_cast.rs:193:23
| |
LL | let _: f64 = -(8.0 as f64).exp(); // should suggest `-8.0_f64.exp()` here not to change code behavior LL | let _: f64 = -(8.0 as f64).exp(); // should suggest `-8.0_f64.exp()` here not to change code behavior
| ^^^^^^^^^^^^ help: try: `8.0_f64` | ^^^^^^^^^^^^ help: try: `8.0_f64`
error: casting to the same type is unnecessary (`f32` -> `f32`) error: casting to the same type is unnecessary (`f32` -> `f32`)
--> $DIR/unnecessary_cast.rs:178:20 --> $DIR/unnecessary_cast.rs:201:20
| |
LL | let _num = foo() as f32; LL | let _num = foo() as f32;
| ^^^^^^^^^^^^ help: try: `foo()` | ^^^^^^^^^^^^ help: try: `foo()`