Do not remove method call if type is adjusted (#15181)

Propose to replace `x.map_or(false, |y| y == z)` by `x == Some(z)` only
if `x` is not adjusted. Otherwise, the type of `x` in the comparaison
may not be the expected one, as it may be the product of an auto-deref.

changelog: [`unnecessary_map_or`]: do not propose to replace the
`map_or` call by a comparaison if types wouldn't be correct

Fixes rust-lang/rust-clippy#15180
This commit is contained in:
Jason Newcomb 2025-07-09 15:04:39 +00:00 committed by GitHub
commit a24fb386b1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 47 additions and 2 deletions

View file

@ -62,7 +62,8 @@ pub(super) fn check<'a>(
let ext_def_span = def.span.until(map.span);
let (sugg, method, applicability) = if let ExprKind::Closure(map_closure) = map.kind
let (sugg, method, applicability) = if cx.typeck_results().expr_adjustments(recv).is_empty()
&& let ExprKind::Closure(map_closure) = map.kind
&& let closure_body = cx.tcx.hir_body(map_closure.body)
&& let closure_body_value = closure_body.value.peel_blocks()
&& let ExprKind::Binary(op, l, r) = closure_body_value.kind

View file

@ -130,3 +130,13 @@ fn issue14201(a: Option<String>, b: Option<String>, s: &String) -> bool {
//~^ unnecessary_map_or
x && y
}
fn issue15180() {
let s = std::sync::Mutex::new(Some("foo"));
_ = s.lock().unwrap().is_some_and(|s| s == "foo");
//~^ unnecessary_map_or
let s = &&&&Some("foo");
_ = s.is_some_and(|s| s == "foo");
//~^ unnecessary_map_or
}

View file

@ -134,3 +134,13 @@ fn issue14201(a: Option<String>, b: Option<String>, s: &String) -> bool {
//~^ unnecessary_map_or
x && y
}
fn issue15180() {
let s = std::sync::Mutex::new(Some("foo"));
_ = s.lock().unwrap().map_or(false, |s| s == "foo");
//~^ unnecessary_map_or
let s = &&&&Some("foo");
_ = s.map_or(false, |s| s == "foo");
//~^ unnecessary_map_or
}

View file

@ -326,5 +326,29 @@ LL - let y = b.map_or(true, |b| b == *s);
LL + let y = b.is_none_or(|b| b == *s);
|
error: aborting due to 26 previous errors
error: this `map_or` can be simplified
--> tests/ui/unnecessary_map_or.rs:140:9
|
LL | _ = s.lock().unwrap().map_or(false, |s| s == "foo");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: use is_some_and instead
|
LL - _ = s.lock().unwrap().map_or(false, |s| s == "foo");
LL + _ = s.lock().unwrap().is_some_and(|s| s == "foo");
|
error: this `map_or` can be simplified
--> tests/ui/unnecessary_map_or.rs:144:9
|
LL | _ = s.map_or(false, |s| s == "foo");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: use is_some_and instead
|
LL - _ = s.map_or(false, |s| s == "foo");
LL + _ = s.is_some_and(|s| s == "foo");
|
error: aborting due to 28 previous errors