Improve needless_pass_by_value suggestion (#13880)

Fixes https://github.com/rust-lang/rust-clippy/issues/13744.

A simple check to check if the type is an `Option` allows to improve the
suggestion.

changelog: Improve `needless_pass_by_value` suggestion
This commit is contained in:
Philipp Krones 2025-03-10 15:48:43 +00:00 committed by GitHub
commit a25cbd50ca
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 24 additions and 3 deletions

View file

@ -279,10 +279,18 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessPassByValue {
}
}
let suggestion = if is_type_diagnostic_item(cx, ty, sym::Option)
&& let snip = snippet(cx, input.span, "_")
&& let Some((first, rest)) = snip.split_once('<')
{
format!("{first}<&{rest}")
} else {
format!("&{}", snippet(cx, input.span, "_"))
};
diag.span_suggestion(
input.span,
"consider taking a reference instead",
format!("&{}", snippet(cx, input.span, "_")),
suggestion,
Applicability::MaybeIncorrect,
);
};

View file

@ -189,6 +189,13 @@ struct Obj(String);
fn prefix_test(_unused_with_prefix: Obj) {}
// Regression test for <https://github.com/rust-lang/rust-clippy/issues/13744>.
// It's more idiomatic to write `Option<&T>` rather than `&Option<T>`.
fn option_inner_ref(x: Option<String>) {
//~^ ERROR: this argument is passed by value, but not consumed in the function body
assert!(x.is_some());
}
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
@ -179,5 +179,11 @@ error: this argument is passed by value, but not consumed in the function body
LL | fn more_fun(items: impl Club<'static, i32>) {}
| ^^^^^^^^^^^^^^^^^^^^^^^ help: consider taking a reference instead: `&impl Club<'static, i32>`
error: aborting due to 22 previous errors
error: this argument is passed by value, but not consumed in the function body
--> tests/ui/needless_pass_by_value.rs:194:24
|
LL | fn option_inner_ref(x: Option<String>) {
| ^^^^^^^^^^^^^^ help: consider taking a reference instead: `Option<&String>`
error: aborting due to 23 previous errors