mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-23 13:13:34 +00:00
Fix incorrect suggestion for manual_unwrap_or_default
This commit is contained in:
parent
29cc5c691c
commit
54b45f7f93
3 changed files with 44 additions and 7 deletions
|
@ -53,6 +53,7 @@ declare_lint_pass!(ManualUnwrapOrDefault => [MANUAL_UNWRAP_OR_DEFAULT]);
|
||||||
|
|
||||||
fn get_some<'tcx>(cx: &LateContext<'tcx>, pat: &Pat<'tcx>) -> Option<HirId> {
|
fn get_some<'tcx>(cx: &LateContext<'tcx>, pat: &Pat<'tcx>) -> Option<HirId> {
|
||||||
if let PatKind::TupleStruct(QPath::Resolved(_, path), &[pat], _) = pat.kind
|
if let PatKind::TupleStruct(QPath::Resolved(_, path), &[pat], _) = pat.kind
|
||||||
|
&& let PatKind::Binding(_, pat_id, _, _) = pat.kind
|
||||||
&& let Some(def_id) = path.res.opt_def_id()
|
&& let Some(def_id) = path.res.opt_def_id()
|
||||||
// Since it comes from a pattern binding, we need to get the parent to actually match
|
// Since it comes from a pattern binding, we need to get the parent to actually match
|
||||||
// against it.
|
// against it.
|
||||||
|
@ -60,13 +61,7 @@ fn get_some<'tcx>(cx: &LateContext<'tcx>, pat: &Pat<'tcx>) -> Option<HirId> {
|
||||||
&& (cx.tcx.lang_items().get(LangItem::OptionSome) == Some(def_id)
|
&& (cx.tcx.lang_items().get(LangItem::OptionSome) == Some(def_id)
|
||||||
|| cx.tcx.lang_items().get(LangItem::ResultOk) == Some(def_id))
|
|| cx.tcx.lang_items().get(LangItem::ResultOk) == Some(def_id))
|
||||||
{
|
{
|
||||||
let mut bindings = Vec::new();
|
Some(pat_id)
|
||||||
pat.each_binding(|_, id, _, _| bindings.push(id));
|
|
||||||
if let &[id] = bindings.as_slice() {
|
|
||||||
Some(id)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,3 +78,24 @@ fn issue_12569() {
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Should not warn!
|
||||||
|
fn issue_12928() {
|
||||||
|
let x = Some((1, 2));
|
||||||
|
let y = if let Some((a, _)) = x { a } else { 0 };
|
||||||
|
let y = if let Some((a, ..)) = x { a } else { 0 };
|
||||||
|
let x = Some([1, 2]);
|
||||||
|
let y = if let Some([a, _]) = x { a } else { 0 };
|
||||||
|
let y = if let Some([a, ..]) = x { a } else { 0 };
|
||||||
|
|
||||||
|
struct X {
|
||||||
|
a: u8,
|
||||||
|
b: u8,
|
||||||
|
}
|
||||||
|
let x = Some(X { a: 0, b: 0 });
|
||||||
|
let y = if let Some(X { a, .. }) = x { a } else { 0 };
|
||||||
|
struct Y(u8, u8);
|
||||||
|
let x = Some(Y(0, 0));
|
||||||
|
let y = if let Some(Y(a, _)) = x { a } else { 0 };
|
||||||
|
let y = if let Some(Y(a, ..)) = x { a } else { 0 };
|
||||||
|
}
|
||||||
|
|
|
@ -111,3 +111,24 @@ fn issue_12569() {
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Should not warn!
|
||||||
|
fn issue_12928() {
|
||||||
|
let x = Some((1, 2));
|
||||||
|
let y = if let Some((a, _)) = x { a } else { 0 };
|
||||||
|
let y = if let Some((a, ..)) = x { a } else { 0 };
|
||||||
|
let x = Some([1, 2]);
|
||||||
|
let y = if let Some([a, _]) = x { a } else { 0 };
|
||||||
|
let y = if let Some([a, ..]) = x { a } else { 0 };
|
||||||
|
|
||||||
|
struct X {
|
||||||
|
a: u8,
|
||||||
|
b: u8,
|
||||||
|
}
|
||||||
|
let x = Some(X { a: 0, b: 0 });
|
||||||
|
let y = if let Some(X { a, .. }) = x { a } else { 0 };
|
||||||
|
struct Y(u8, u8);
|
||||||
|
let x = Some(Y(0, 0));
|
||||||
|
let y = if let Some(Y(a, _)) = x { a } else { 0 };
|
||||||
|
let y = if let Some(Y(a, ..)) = x { a } else { 0 };
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue