summaryrefslogtreecommitdiffstats
path: root/src/tools/clippy/clippy_lints/src/types/redundant_allocation.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/clippy/clippy_lints/src/types/redundant_allocation.rs')
-rw-r--r--src/tools/clippy/clippy_lints/src/types/redundant_allocation.rs24
1 files changed, 8 insertions, 16 deletions
diff --git a/src/tools/clippy/clippy_lints/src/types/redundant_allocation.rs b/src/tools/clippy/clippy_lints/src/types/redundant_allocation.rs
index 2b964b64a..fae5385ff 100644
--- a/src/tools/clippy/clippy_lints/src/types/redundant_allocation.rs
+++ b/src/tools/clippy/clippy_lints/src/types/redundant_allocation.rs
@@ -5,16 +5,12 @@ use rustc_errors::Applicability;
use rustc_hir::{self as hir, def_id::DefId, QPath, TyKind};
use rustc_hir_analysis::hir_ty_to_ty;
use rustc_lint::LateContext;
+use rustc_middle::ty::TypeVisitable;
use rustc_span::symbol::sym;
use super::{utils, REDUNDANT_ALLOCATION};
-pub(super) fn check(
- cx: &LateContext<'_>,
- hir_ty: &hir::Ty<'_>,
- qpath: &QPath<'_>,
- def_id: DefId,
-) -> bool {
+pub(super) fn check(cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>, qpath: &QPath<'_>, def_id: DefId) -> bool {
let mut applicability = Applicability::MaybeIncorrect;
let outer_sym = if Some(def_id) == cx.tcx.lang_items().owned_box() {
"Box"
@@ -34,12 +30,7 @@ pub(super) fn check(
hir_ty.span,
&format!("usage of `{outer_sym}<{generic_snippet}>`"),
|diag| {
- diag.span_suggestion(
- hir_ty.span,
- "try",
- format!("{generic_snippet}"),
- applicability,
- );
+ diag.span_suggestion(hir_ty.span, "try", format!("{generic_snippet}"), applicability);
diag.note(&format!(
"`{generic_snippet}` is already a pointer, `{outer_sym}<{generic_snippet}>` allocates a pointer on the heap"
));
@@ -61,15 +52,16 @@ pub(super) fn check(
return false
};
let inner_span = match qpath_generic_tys(inner_qpath).next() {
- Some(ty) => {
+ Some(hir_ty) => {
// Reallocation of a fat pointer causes it to become thin. `hir_ty_to_ty` is safe to use
// here because `mod.rs` guarantees this lint is only run on types outside of bodies and
// is not run on locals.
- if !hir_ty_to_ty(cx.tcx, ty).is_sized(cx.tcx, cx.param_env) {
+ let ty = hir_ty_to_ty(cx.tcx, hir_ty);
+ if ty.has_escaping_bound_vars() || !ty.is_sized(cx.tcx, cx.param_env) {
return false;
}
- ty.span
- }
+ hir_ty.span
+ },
None => return false,
};
if inner_sym == outer_sym {