//@normalize-stderr-test: "\(\d+ byte\)" -> "(N byte)" //@normalize-stderr-test: "\(limit: \d+ byte\)" -> "(limit: N byte)" #![deny(clippy::trivially_copy_pass_by_ref)] #![allow( clippy::disallowed_names, clippy::extra_unused_lifetimes, clippy::needless_lifetimes, clippy::needless_pass_by_ref_mut, clippy::redundant_field_names, clippy::uninlined_format_args )] #[derive(Copy, Clone)] struct Foo(u32); #[derive(Copy, Clone)] struct Bar([u8; 24]); #[derive(Copy, Clone)] pub struct Color { pub r: u8, pub g: u8, pub b: u8, pub a: u8, } struct FooRef<'a> { foo: &'a Foo, } type Baz = u32; fn good(a: &mut u32, b: u32, c: &Bar) {} fn good_return_implicit_lt_ref(foo: &Foo) -> &u32 { &foo.0 } #[allow(clippy::needless_lifetimes)] fn good_return_explicit_lt_ref<'a>(foo: &'a Foo) -> &'a u32 { &foo.0 } #[allow(mismatched_lifetime_syntaxes)] fn good_return_implicit_lt_struct(foo: &Foo) -> FooRef { FooRef { foo } } #[allow(clippy::needless_lifetimes)] fn good_return_explicit_lt_struct<'a>(foo: &'a Foo) -> FooRef<'a> { FooRef { foo } } fn bad(x: u32, y: Foo, z: Baz) {} //~^ ERROR: this argument (4 byte) is passed by reference, but would be more efficient if passed by //~| ERROR: this argument (4 byte) is passed by reference, but would be more efficient if passed by //~| ERROR: this argument (4 byte) is passed by reference, but would be more efficient if passed by impl Foo { fn good(self, a: &mut u32, b: u32, c: &Bar) {} fn good2(&mut self) {} fn bad(self, x: u32, y: Foo, z: Baz) {} //~^ ERROR: this argument (4 byte) is passed by reference, but would be more efficient if passed by //~| ERROR: this argument (4 byte) is passed by reference, but would be more efficient if passed by //~| ERROR: this argument (4 byte) is passed by reference, but would be more efficient if passed by //~| ERROR: this argument (4 byte) is passed by reference, but would be more efficient if passed by fn bad2(x: u32, y: Foo, z: Baz) {} //~^ ERROR: this argument (4 byte) is passed by reference, but would be more efficient if passed by //~| ERROR: this argument (4 byte) is passed by reference, but would be more efficient if passed by //~| ERROR: this argument (4 byte) is passed by reference, but would be more efficient if passed by fn bad_issue7518(self, other: Self) {} //~^ ERROR: this argument (4 byte) is passed by reference, but would be more efficient if } impl AsRef for Foo { fn as_ref(&self) -> &u32 { &self.0 } } impl Bar { fn good(&self, a: &mut u32, b: u32, c: &Bar) {} fn bad2(x: u32, y: Foo, z: Baz) {} //~^ ERROR: this argument (4 byte) is passed by reference, but would be more efficient if //~| ERROR: this argument (4 byte) is passed by reference, but would be more efficient if //~| ERROR: this argument (4 byte) is passed by reference, but would be more efficient if } trait MyTrait { fn trait_method(&self, foo: Foo); //~^ ERROR: this argument (4 byte) is passed by reference, but would be more efficient if } pub trait MyTrait2 { fn trait_method2(&self, color: &Color); } trait MyTrait3 { #[expect(clippy::trivially_copy_pass_by_ref)] fn trait_method(&self, foo: &Foo); } // Trait impls should not warn impl MyTrait3 for Foo { fn trait_method(&self, foo: &Foo) { unimplemented!() } } mod issue3992 { pub trait A { #[allow(clippy::trivially_copy_pass_by_ref)] fn a(b: &u16) {} } #[allow(clippy::trivially_copy_pass_by_ref)] pub fn c(d: &u16) {} } mod issue5876 { // Don't lint here as it is always inlined #[inline(always)] fn foo_always(x: &i32) { println!("{}", x); } #[inline(never)] fn foo_never(x: i32) { //~^ ERROR: this argument (4 byte) is passed by reference, but would be more efficient if passed by println!("{}", x); } #[inline] fn foo(x: i32) { //~^ ERROR: this argument (4 byte) is passed by reference, but would be more efficient if passed by println!("{}", x); } } fn ref_to_opt_ref_implicit(x: &u32) -> Option<&u32> { Some(x) } fn ref_to_opt_ref_explicit<'a>(x: &'a u32) -> Option<&'a u32> { Some(x) } fn with_constraint<'a, 'b: 'a>(x: &'b u32, y: &'a u32) -> &'a u32 { if true { x } else { y } } async fn async_implicit(x: &u32) -> &u32 { x } async fn async_explicit<'a>(x: &'a u32) -> &'a u32 { x } fn unrelated_lifetimes<'a, 'b>(_x: u32, y: &'b u32) -> &'b u32 { //~^ ERROR: this argument (4 byte) is passed by reference, but would be more efficient if passed by y } fn return_ptr(x: &u32) -> *const u32 { x } fn return_field_ptr(x: &(u32, u32)) -> *const u32 { &x.0 } fn return_field_ptr_addr_of(x: &(u32, u32)) -> *const u32 { core::ptr::addr_of!(x.0) }