Auto merge of #7535 - LeSeulArtichaut:7518-self-ty-arg, r=xFrednet

Properly handle `Self` type for `trivially_copy_pass_by_ref`

changelog: properly handle `Self` type for [`trivially_copy_pass_by_ref`].

Fixes #7518
This commit is contained in:
bors 2021-08-10 10:25:26 +00:00
commit 76c4a337d1
3 changed files with 17 additions and 9 deletions

View file

@ -2,9 +2,9 @@ use std::cmp;
use std::iter; use std::iter;
use clippy_utils::diagnostics::span_lint_and_sugg; use clippy_utils::diagnostics::span_lint_and_sugg;
use clippy_utils::is_self_ty;
use clippy_utils::source::snippet; use clippy_utils::source::snippet;
use clippy_utils::ty::is_copy; use clippy_utils::ty::is_copy;
use clippy_utils::{is_self, is_self_ty};
use if_chain::if_chain; use if_chain::if_chain;
use rustc_ast::attr; use rustc_ast::attr;
use rustc_errors::Applicability; use rustc_errors::Applicability;
@ -170,7 +170,7 @@ impl<'tcx> PassByRefOrValue {
if size <= self.ref_min_size; if size <= self.ref_min_size;
if let hir::TyKind::Rptr(_, MutTy { ty: decl_ty, .. }) = input.kind; if let hir::TyKind::Rptr(_, MutTy { ty: decl_ty, .. }) = input.kind;
then { then {
let value_type = if is_self_ty(decl_ty) { let value_type = if fn_body.and_then(|body| body.params.get(index)).map_or(false, is_self) {
"self".into() "self".into()
} else { } else {
snippet(cx, decl_ty.span, "_").into() snippet(cx, decl_ty.span, "_").into()

View file

@ -58,6 +58,8 @@ impl Foo {
fn bad(&self, x: &u32, y: &Foo, z: &Baz) {} fn bad(&self, x: &u32, y: &Foo, z: &Baz) {}
fn bad2(x: &u32, y: &Foo, z: &Baz) {} fn bad2(x: &u32, y: &Foo, z: &Baz) {}
fn bad_issue7518(self, other: &Self) {}
} }
impl AsRef<u32> for Foo { impl AsRef<u32> for Foo {

View file

@ -65,40 +65,46 @@ LL | fn bad2(x: &u32, y: &Foo, z: &Baz) {}
| ^^^^ help: consider passing by value instead: `Baz` | ^^^^ help: consider passing by value instead: `Baz`
error: this argument (N byte) is passed by reference, but would be more efficient if passed by value (limit: N byte) error: this argument (N byte) is passed by reference, but would be more efficient if passed by value (limit: N byte)
--> $DIR/trivially_copy_pass_by_ref.rs:72:16 --> $DIR/trivially_copy_pass_by_ref.rs:62:35
|
LL | fn bad_issue7518(self, other: &Self) {}
| ^^^^^ help: consider passing by value instead: `Self`
error: this argument (N byte) is passed by reference, but would be more efficient if passed by value (limit: N byte)
--> $DIR/trivially_copy_pass_by_ref.rs:74:16
| |
LL | fn bad2(x: &u32, y: &Foo, z: &Baz) {} LL | fn bad2(x: &u32, y: &Foo, z: &Baz) {}
| ^^^^ help: consider passing by value instead: `u32` | ^^^^ help: consider passing by value instead: `u32`
error: this argument (N byte) is passed by reference, but would be more efficient if passed by value (limit: N byte) error: this argument (N byte) is passed by reference, but would be more efficient if passed by value (limit: N byte)
--> $DIR/trivially_copy_pass_by_ref.rs:72:25 --> $DIR/trivially_copy_pass_by_ref.rs:74:25
| |
LL | fn bad2(x: &u32, y: &Foo, z: &Baz) {} LL | fn bad2(x: &u32, y: &Foo, z: &Baz) {}
| ^^^^ help: consider passing by value instead: `Foo` | ^^^^ help: consider passing by value instead: `Foo`
error: this argument (N byte) is passed by reference, but would be more efficient if passed by value (limit: N byte) error: this argument (N byte) is passed by reference, but would be more efficient if passed by value (limit: N byte)
--> $DIR/trivially_copy_pass_by_ref.rs:72:34 --> $DIR/trivially_copy_pass_by_ref.rs:74:34
| |
LL | fn bad2(x: &u32, y: &Foo, z: &Baz) {} LL | fn bad2(x: &u32, y: &Foo, z: &Baz) {}
| ^^^^ help: consider passing by value instead: `Baz` | ^^^^ help: consider passing by value instead: `Baz`
error: this argument (N byte) is passed by reference, but would be more efficient if passed by value (limit: N byte) error: this argument (N byte) is passed by reference, but would be more efficient if passed by value (limit: N byte)
--> $DIR/trivially_copy_pass_by_ref.rs:76:34 --> $DIR/trivially_copy_pass_by_ref.rs:78:34
| |
LL | fn trait_method(&self, _foo: &Foo); LL | fn trait_method(&self, _foo: &Foo);
| ^^^^ help: consider passing by value instead: `Foo` | ^^^^ help: consider passing by value instead: `Foo`
error: this argument (N byte) is passed by reference, but would be more efficient if passed by value (limit: N byte) error: this argument (N byte) is passed by reference, but would be more efficient if passed by value (limit: N byte)
--> $DIR/trivially_copy_pass_by_ref.rs:108:21 --> $DIR/trivially_copy_pass_by_ref.rs:110:21
| |
LL | fn foo_never(x: &i32) { LL | fn foo_never(x: &i32) {
| ^^^^ help: consider passing by value instead: `i32` | ^^^^ help: consider passing by value instead: `i32`
error: this argument (N byte) is passed by reference, but would be more efficient if passed by value (limit: N byte) error: this argument (N byte) is passed by reference, but would be more efficient if passed by value (limit: N byte)
--> $DIR/trivially_copy_pass_by_ref.rs:113:15 --> $DIR/trivially_copy_pass_by_ref.rs:115:15
| |
LL | fn foo(x: &i32) { LL | fn foo(x: &i32) {
| ^^^^ help: consider passing by value instead: `i32` | ^^^^ help: consider passing by value instead: `i32`
error: aborting due to 16 previous errors error: aborting due to 17 previous errors