diff options
| author | bors <bors@rust-lang.org> | 2022-04-06 08:27:03 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-04-06 08:27:03 +0000 |
| commit | 880ff2497d723bc8bf64a7304c0011bc25bef5b0 (patch) | |
| tree | 03dde27c4a442c9babbbf23d5eaca6a6d8edcd21 | |
| parent | 41f2eccf92c54337b727d891e42ba66105c56d0d (diff) | |
| parent | ec851b870b59848bdbf531928a7cf38225d3a12e (diff) | |
| download | rust-880ff2497d723bc8bf64a7304c0011bc25bef5b0.tar.gz rust-880ff2497d723bc8bf64a7304c0011bc25bef5b0.zip | |
Auto merge of #8596 - Jaic1:unnecessary_cast, r=flip1995
Fix unnecessary_cast suggestion for type aliasses Fix #6923. The [`unnecessary_cast`] lint now will skip casting to non-primitive type. changelog: fix lint [`unnecessary_cast `]
| -rw-r--r-- | clippy_lints/src/casts/unnecessary_cast.rs | 14 | ||||
| -rw-r--r-- | tests/ui/unnecessary_cast.rs | 6 | ||||
| -rw-r--r-- | tests/ui/unnecessary_cast_fixable.fixed | 5 | ||||
| -rw-r--r-- | tests/ui/unnecessary_cast_fixable.rs | 5 |
4 files changed, 29 insertions, 1 deletions
diff --git a/clippy_lints/src/casts/unnecessary_cast.rs b/clippy_lints/src/casts/unnecessary_cast.rs index 470c8c7ea26..af56ec11ef8 100644 --- a/clippy_lints/src/casts/unnecessary_cast.rs +++ b/clippy_lints/src/casts/unnecessary_cast.rs @@ -4,7 +4,8 @@ use clippy_utils::source::snippet_opt; use if_chain::if_chain; use rustc_ast::{LitFloatType, LitIntType, LitKind}; use rustc_errors::Applicability; -use rustc_hir::{Expr, ExprKind, Lit, UnOp}; +use rustc_hir::def::Res; +use rustc_hir::{Expr, ExprKind, Lit, QPath, TyKind, UnOp}; use rustc_lint::{LateContext, LintContext}; use rustc_middle::lint::in_external_macro; use rustc_middle::ty::{self, FloatTy, InferTy, Ty}; @@ -18,6 +19,17 @@ pub(super) fn check( cast_from: Ty<'_>, cast_to: Ty<'_>, ) -> bool { + // skip non-primitive type cast + if_chain! { + if let ExprKind::Cast(_, cast_to) = expr.kind; + if let TyKind::Path(QPath::Resolved(_, path)) = &cast_to.kind; + if let Res::PrimTy(_) = path.res; + then {} + else { + return false + } + } + if let Some(lit) = get_numeric_literal(cast_expr) { let literal_str = snippet_opt(cx, cast_expr.span).unwrap_or_default(); diff --git a/tests/ui/unnecessary_cast.rs b/tests/ui/unnecessary_cast.rs index b77c19f2ba5..62c3e963686 100644 --- a/tests/ui/unnecessary_cast.rs +++ b/tests/ui/unnecessary_cast.rs @@ -30,4 +30,10 @@ fn main() { // do not lint cast to cfg-dependant type 1 as std::os::raw::c_char; + + // do not lint cast to alias type + 1 as I32Alias; + &1 as &I32Alias; } + +type I32Alias = i32; diff --git a/tests/ui/unnecessary_cast_fixable.fixed b/tests/ui/unnecessary_cast_fixable.fixed index 3332f49c80c..36800c5340d 100644 --- a/tests/ui/unnecessary_cast_fixable.fixed +++ b/tests/ui/unnecessary_cast_fixable.fixed @@ -42,4 +42,9 @@ fn main() { let _ = -1_i32; let _ = -1.0_f32; + + let _ = 1 as I32Alias; + let _ = &1 as &I32Alias; } + +type I32Alias = i32; diff --git a/tests/ui/unnecessary_cast_fixable.rs b/tests/ui/unnecessary_cast_fixable.rs index ec01e938779..d4b6bb952ab 100644 --- a/tests/ui/unnecessary_cast_fixable.rs +++ b/tests/ui/unnecessary_cast_fixable.rs @@ -42,4 +42,9 @@ fn main() { let _ = -1 as i32; let _ = -1.0 as f32; + + let _ = 1 as I32Alias; + let _ = &1 as &I32Alias; } + +type I32Alias = i32; |
