1 use clippy_utils::diagnostics::span_lint_and_sugg;
2 use clippy_utils::is_trait_method;
3 use clippy_utils::msrvs::{self, Msrv};
4 use clippy_utils::ty::{get_iterator_item_ty, is_copy};
5 use rustc_errors::Applicability;
7 use rustc_lint::LateContext;
9 use rustc_span::{sym, Span};
11 use super::CLONED_INSTEAD_OF_COPIED;
13 pub fn check(cx: &LateContext<'_>, expr: &Expr<'_>, recv: &Expr<'_>, span: Span, msrv: &Msrv) {
14 let recv_ty = cx.typeck_results().expr_ty_adjusted(recv);
15 let inner_ty = match recv_ty.kind() {
18 if cx.tcx.is_diagnostic_item(sym::Option, adt.did()) && msrv.meets(msrvs::OPTION_COPIED) =>
22 _ if is_trait_method(cx, expr, sym::Iterator) && msrv.meets(msrvs::ITERATOR_COPIED) => {
23 match get_iterator_item_ty(cx, recv_ty) {
24 // <T as Iterator>::Item
31 match inner_ty.kind() {
33 ty::Ref(_, ty, _) if is_copy(cx, *ty) => {},
38 CLONED_INSTEAD_OF_COPIED,
40 "used `cloned` where `copied` could be used instead",
43 Applicability::MachineApplicable,