Skip to content

Commit 34aa735

Browse files
author
Lukas Markeffsky
committed
clippy: handle supertraits of Sized
1 parent c0c2feb commit 34aa735

File tree

3 files changed

+11
-5
lines changed

3 files changed

+11
-5
lines changed

src/tools/clippy/clippy_lints/src/methods/unnecessary_to_owned.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use rustc_middle::ty::{
2323
};
2424
use rustc_span::{sym, Symbol};
2525
use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt as _;
26-
use rustc_trait_selection::traits::{Obligation, ObligationCause};
26+
use rustc_trait_selection::traits::{self, Obligation, ObligationCause};
2727

2828
use super::UNNECESSARY_TO_OWNED;
2929

@@ -323,9 +323,10 @@ fn check_other_call_arg<'tcx>(
323323
&& let (input, n_refs) = peel_mid_ty_refs(*input)
324324
&& let (trait_predicates, _) = get_input_traits_and_projections(cx, callee_def_id, input)
325325
&& let Some(sized_def_id) = cx.tcx.lang_items().sized_trait()
326+
&& let sized_super_def_ids = traits::supertrait_def_ids(cx.tcx, sized_def_id).collect::<Vec<_>>()
326327
&& let [trait_predicate] = trait_predicates
327328
.iter()
328-
.filter(|trait_predicate| trait_predicate.def_id() != sized_def_id)
329+
.filter(|trait_predicate| !sized_super_def_ids.contains(&trait_predicate.def_id()))
329330
.collect::<Vec<_>>()[..]
330331
&& let Some(deref_trait_id) = cx.tcx.get_diagnostic_item(sym::Deref)
331332
&& let Some(as_ref_trait_id) = cx.tcx.get_diagnostic_item(sym::AsRef)

src/tools/clippy/clippy_lints/src/needless_borrows_for_generic_args.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use rustc_middle::ty::{
1818
use rustc_session::impl_lint_pass;
1919
use rustc_span::symbol::sym;
2020
use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt as _;
21-
use rustc_trait_selection::traits::{Obligation, ObligationCause};
21+
use rustc_trait_selection::traits::{self, Obligation, ObligationCause};
2222
use std::collections::VecDeque;
2323

2424
declare_clippy_lint! {
@@ -171,6 +171,10 @@ fn needless_borrow_count<'tcx>(
171171
let sized_trait_def_id = cx.tcx.lang_items().sized_trait();
172172
let drop_trait_def_id = cx.tcx.lang_items().drop_trait();
173173

174+
let sized_super_def_ids = sized_trait_def_id.map_or_else(Vec::new, |sized_def_id| {
175+
traits::supertrait_def_ids(cx.tcx, sized_def_id).collect()
176+
});
177+
174178
let fn_sig = cx.tcx.fn_sig(fn_id).instantiate_identity().skip_binder();
175179
let predicates = cx.tcx.param_env(fn_id).caller_bounds();
176180
let projection_predicates = predicates
@@ -203,7 +207,7 @@ fn needless_borrow_count<'tcx>(
203207
})
204208
.all(|trait_def_id| {
205209
Some(trait_def_id) == destruct_trait_def_id
206-
|| Some(trait_def_id) == sized_trait_def_id
210+
|| sized_super_def_ids.contains(&trait_def_id)
207211
|| cx.tcx.is_diagnostic_item(sym::Any, trait_def_id)
208212
})
209213
{

src/tools/clippy/clippy_lints/src/needless_pass_by_value.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,14 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessPassByValue {
118118
];
119119

120120
let sized_trait = need!(cx.tcx.lang_items().sized_trait());
121+
let sized_super_traits = traits::supertrait_def_ids(cx.tcx, sized_trait).collect::<Vec<_>>();
121122

122123
let preds = traits::elaborate(cx.tcx, cx.param_env.caller_bounds().iter())
123124
.filter(|p| !p.is_global())
124125
.filter_map(|pred| {
125126
// Note that we do not want to deal with qualified predicates here.
126127
match pred.kind().no_bound_vars() {
127-
Some(ty::ClauseKind::Trait(pred)) if pred.def_id() != sized_trait => Some(pred),
128+
Some(ty::ClauseKind::Trait(pred)) if !sized_super_traits.contains(&pred.def_id()) => Some(pred),
128129
_ => None,
129130
}
130131
})

0 commit comments

Comments
 (0)