2023-07-17 08:19:29 +00:00
|
|
|
#![allow(unused_braces, unused_variables, dead_code)]
|
|
|
|
#![allow(
|
|
|
|
clippy::collapsible_else_if,
|
|
|
|
clippy::unused_unit,
|
|
|
|
clippy::let_unit_value,
|
|
|
|
clippy::match_single_binding,
|
|
|
|
clippy::never_loop
|
|
|
|
)]
|
|
|
|
#![warn(clippy::manual_let_else, clippy::question_mark)]
|
|
|
|
|
|
|
|
enum Variant {
|
|
|
|
A(usize, usize),
|
|
|
|
B(usize),
|
|
|
|
C,
|
|
|
|
}
|
|
|
|
|
|
|
|
fn g() -> Option<(u8, u8)> {
|
|
|
|
None
|
|
|
|
}
|
|
|
|
|
|
|
|
fn e() -> Variant {
|
|
|
|
Variant::A(0, 0)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {}
|
|
|
|
|
|
|
|
fn foo() -> Option<()> {
|
|
|
|
// Fire here, normal case
|
|
|
|
let v = g()?;
|
|
|
|
|
|
|
|
// Don't fire here, the pattern is refutable
|
|
|
|
let Variant::A(v, w) = e() else { return None };
|
|
|
|
|
|
|
|
// Fire here, the pattern is irrefutable
|
|
|
|
let (v, w) = g()?;
|
|
|
|
|
|
|
|
// Don't fire manual_let_else in this instance: question mark can be used instead.
|
|
|
|
let v = g()?;
|
|
|
|
|
|
|
|
// Do fire manual_let_else in this instance: question mark cannot be used here due to the return
|
|
|
|
// body.
|
|
|
|
let Some(v) = g() else {
|
|
|
|
return Some(());
|
|
|
|
};
|
|
|
|
|
|
|
|
// Here we could also fire the question_mark lint, but we don't (as it's a match and not an if let).
|
|
|
|
// So we still emit manual_let_else here. For the *resulting* code, we *do* emit the question_mark
|
|
|
|
// lint, so for rustfix reasons, we allow the question_mark lint here.
|
|
|
|
#[allow(clippy::question_mark)]
|
|
|
|
{
|
|
|
|
let Some(v) = g() else { return None };
|
|
|
|
}
|
|
|
|
|
|
|
|
// This is a copy of the case above where we'd fire the question_mark lint, but here we have allowed
|
|
|
|
// it. Make sure that manual_let_else is fired as the fallback.
|
|
|
|
#[allow(clippy::question_mark)]
|
|
|
|
{
|
|
|
|
let Some(v) = g() else { return None };
|
|
|
|
}
|
|
|
|
|
|
|
|
Some(())
|
|
|
|
}
|
2023-12-28 18:33:07 +00:00
|
|
|
|
|
|
|
// lint not just `return None`, but also `return None;` (note the semicolon)
|
|
|
|
fn issue11993(y: Option<i32>) -> Option<i32> {
|
|
|
|
let x = y?;
|
|
|
|
|
|
|
|
// don't lint: more than one statement in the else body
|
|
|
|
let Some(x) = y else {
|
|
|
|
todo!();
|
|
|
|
return None;
|
|
|
|
};
|
|
|
|
|
|
|
|
let Some(x) = y else {
|
|
|
|
// Roses are red,
|
|
|
|
// violets are blue,
|
|
|
|
// please keep this comment,
|
|
|
|
// it's art, you know?
|
|
|
|
return None;
|
|
|
|
};
|
|
|
|
|
|
|
|
None
|
|
|
|
}
|