]>
git.proxmox.com Git - rustc.git/blob - src/tools/clippy/clippy_lints/src/mut_reference.rs
2 use rustc
::ty
::{self, Ty}
;
3 use rustc
::ty
::subst
::Subst
;
7 /// **What it does:** Detects giving a mutable reference to a function that only
8 /// requires an immutable reference.
10 /// **Why is this bad?** The immutable reference rules out all other references
11 /// to the value. Also the code misleads about the intent of the call site.
13 /// **Known problems:** None.
17 /// my_vec.push(&mut value)
19 declare_clippy_lint
! {
20 pub UNNECESSARY_MUT_PASSED
,
22 "an argument passed as a mutable reference although the callee only demands an \
27 #[derive(Copy, Clone)]
28 pub struct UnnecessaryMutPassed
;
30 impl LintPass
for UnnecessaryMutPassed
{
31 fn get_lints(&self) -> LintArray
{
32 lint_array
!(UNNECESSARY_MUT_PASSED
)
36 impl<'a
, 'tcx
> LateLintPass
<'a
, 'tcx
> for UnnecessaryMutPassed
{
37 fn check_expr(&mut self, cx
: &LateContext
<'a
, 'tcx
>, e
: &'tcx Expr
) {
39 ExprCall(ref fn_expr
, ref arguments
) => if let ExprPath(ref path
) = fn_expr
.node
{
43 cx
.tables
.expr_ty(fn_expr
),
44 &print
::to_string(print
::NO_ANN
, |s
| s
.print_qpath(path
, false)),
47 ExprMethodCall(ref path
, _
, ref arguments
) => {
48 let def_id
= cx
.tables
.type_dependent_defs()[e
.hir_id
].def_id();
49 let substs
= cx
.tables
.node_substs(e
.hir_id
);
50 let method_type
= cx
.tcx
.type_of(def_id
).subst(cx
.tcx
, substs
);
51 check_arguments(cx
, arguments
, method_type
, &path
.name
.as_str())
58 fn check_arguments
<'a
, 'tcx
>(cx
: &LateContext
<'a
, 'tcx
>, arguments
: &[Expr
], type_definition
: Ty
<'tcx
>, name
: &str) {
59 match type_definition
.sty
{
60 ty
::TyFnDef(..) | ty
::TyFnPtr(_
) => {
61 let parameters
= type_definition
.fn_sig(cx
.tcx
).skip_binder().inputs();
62 for (argument
, parameter
) in arguments
.iter().zip(parameters
.iter()) {
69 ty
::TyRawPtr(ty
::TypeAndMut
{
72 }) => if let ExprAddrOf(MutMutable
, _
) = argument
.node
{
75 UNNECESSARY_MUT_PASSED
,
77 &format
!("The function/method `{}` doesn't need a mutable reference", name
),