needless_pass_by_value: reference the innermost Option content

If types such as `Option<Option<String>>` are not used by value, then
`Option<Option<&String>>` will be suggested, instead of
`Option<&Option<String>>`.
This commit is contained in:
Samuel Tardieu 2025-03-11 20:59:03 +01:00
parent 8f280ff813
commit 35e6057e71
4 changed files with 83 additions and 17 deletions

View file

@ -196,6 +196,35 @@ fn option_inner_ref(x: Option<String>) {
assert!(x.is_some());
}
mod non_standard {
#[derive(Debug)]
pub struct Option<T>(T);
}
fn non_standard_option(x: non_standard::Option<String>) {
//~^ needless_pass_by_value
dbg!(&x);
}
fn option_by_name(x: Option<std::option::Option<core::option::Option<non_standard::Option<String>>>>) {
//~^ needless_pass_by_value
dbg!(&x);
}
type OptStr = Option<String>;
fn non_option(x: OptStr) {
//~^ needless_pass_by_value
dbg!(&x);
}
type Opt<T> = Option<T>;
fn non_option_either(x: Opt<String>) {
//~^ needless_pass_by_value
dbg!(&x);
}
fn main() {
// This should not cause an ICE either
// https://github.com/rust-lang/rust-clippy/issues/3144

View file

@ -29,7 +29,7 @@ error: this argument is passed by value, but not consumed in the function body
--> tests/ui/needless_pass_by_value.rs:58:18
|
LL | fn test_match(x: Option<Option<String>>, y: Option<Option<String>>) {
| ^^^^^^^^^^^^^^^^^^^^^^ help: consider taking a reference instead: `Option<&Option<String>>`
| ^^^^^^^^^^^^^^^^^^^^^^ help: consider taking a reference instead: `Option<Option<&String>>`
error: this argument is passed by value, but not consumed in the function body
--> tests/ui/needless_pass_by_value.rs:73:24
@ -185,5 +185,29 @@ error: this argument is passed by value, but not consumed in the function body
LL | fn option_inner_ref(x: Option<String>) {
| ^^^^^^^^^^^^^^ help: consider taking a reference instead: `Option<&String>`
error: aborting due to 23 previous errors
error: this argument is passed by value, but not consumed in the function body
--> tests/ui/needless_pass_by_value.rs:204:27
|
LL | fn non_standard_option(x: non_standard::Option<String>) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider taking a reference instead: `&non_standard::Option<String>`
error: this argument is passed by value, but not consumed in the function body
--> tests/ui/needless_pass_by_value.rs:209:22
|
LL | fn option_by_name(x: Option<std::option::Option<core::option::Option<non_standard::Option<String>>>>) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider taking a reference instead: `Option<std::option::Option<core::option::Option<&non_standard::Option<String>>>>`
error: this argument is passed by value, but not consumed in the function body
--> tests/ui/needless_pass_by_value.rs:216:18
|
LL | fn non_option(x: OptStr) {
| ^^^^^^ help: consider taking a reference instead: `&OptStr`
error: this argument is passed by value, but not consumed in the function body
--> tests/ui/needless_pass_by_value.rs:223:25
|
LL | fn non_option_either(x: Opt<String>) {
| ^^^^^^^^^^^ help: consider taking a reference instead: `&Opt<String>`
error: aborting due to 27 previous errors