1 #![allow(unused_braces, unused_variables, dead_code)]
3 clippy::collapsible_else_if,
5 clippy::let_unit_value,
8 #![warn(clippy::manual_let_else)]
10 fn g() -> Option<()> {
17 let v = if let Some(v_some) = g() { v_some } else { return };
18 let v = if let Some(v_some) = g() {
24 let v = if let Some(v) = g() {
25 // Blocks around the identity should have no impact
30 // Some computation should still make it fire
35 // continue and break diverge
37 let v = if let Some(v_some) = g() { v_some } else { continue };
38 let v = if let Some(v_some) = g() { v_some } else { break };
41 // panic also diverges
42 let v = if let Some(v_some) = g() { v_some } else { panic!() };
44 // abort also diverges
45 let v = if let Some(v_some) = g() {
51 // If whose two branches diverge also diverges
52 let v = if let Some(v_some) = g() {
55 if true { return } else { panic!() }
59 let v = if let Some(v_some) = g() {
67 // All match arms diverge
68 let v = if let Some(v_some) = g() {
72 (Some(_), None) => return,
84 // Tuples supported for the declared variables
85 let (v, w) = if let Some(v_some) = g().map(|v| (v, 42)) {
91 // Tuples supported for the identity block and pattern
92 let v = if let (Some(v_some), w_some) = (g(), 0) {
98 // entirely inside macro lints
99 macro_rules! create_binding_if_some {
100 ($n:ident, $e:expr) => {
101 let $n = if let Some(v) = $e { v } else { return };
104 create_binding_if_some!(w, g());
108 let v = if let Some(v_some) = g() {
109 // Nothing returned. Should not fire.
115 let v = if let Some(v_some) = g() {
116 // Different variable than v_some. Should not fire.
122 let v = if let Some(v_some) = g() {
123 // Computation in then clause. Should not fire.
130 let v = if let Some(v_some) = g() {
136 // This doesn't diverge. Should not fire.
140 let v = if let Some(v_some) = g() {
143 // There is one match arm that doesn't diverge. Should not fire.
145 (Some(_), None) => return,
146 (None, Some(_)) => return,
147 (Some(_), Some(_)) => (),
152 let v = if let Some(v_some) = g() {
155 // loop with a break statement inside does not diverge.
162 let v = if let Some(v_some) = g() {
166 fn un() -> Uninhabited {
169 // Don't lint if the type is uninhabited but not !
173 fn question_mark() -> Option<()> {
174 let v = if let Some(v) = g() {
177 // Question mark does not diverge
183 // Macro boundary inside let
184 macro_rules! some_or_return {
186 if let Some(v) = $e { v } else { return }
189 let v = some_or_return!(g());
191 // Also macro boundary inside let, but inside a macro
192 macro_rules! create_binding_if_some_nf {
193 ($n:ident, $e:expr) => {
194 let $n = some_or_return!($e);
197 create_binding_if_some_nf!(v, g());