| // https://github.com/rust-lang/rust/issues/139369 |
| // Test that the lint `irrefutable_let_patterns` now |
| // only checks single let binding. |
| //@ edition: 2024 |
| //@ check-pass |
| |
| use std::ops::Range; |
| |
| fn main() { |
| let opt = Some(None..Some(1)); |
| |
| // test `if let` |
| if let first = &opt {} |
| //~^ WARN irrefutable `if let` pattern |
| |
| if let first = &opt && let Some(second) = first {} |
| |
| if let first = &opt && let (a, b) = (1, 2) {} |
| |
| if let first = &opt && let None = Some(1) {} |
| |
| if 4 * 2 == 0 && let first = &opt {} |
| |
| if let first = &opt |
| && let Some(second) = first |
| && let None = second.start |
| && let v = 0 |
| {} |
| |
| if let Range { start: local_start, end: _ } = (None..Some(1)) {} |
| //~^ WARN irrefutable `if let` pattern |
| |
| if let Range { start: local_start, end: _ } = (None..Some(1)) |
| && let None = local_start |
| {} |
| |
| if let (a, b, c) = (Some(1), Some(1), Some(1)) {} |
| //~^ WARN irrefutable `if let` pattern |
| |
| if let (a, b, c) = (Some(1), Some(1), Some(1)) && let None = Some(1) {} |
| |
| if let Some(ref first) = opt |
| && let Range { start: local_start, end: _ } = first |
| && let None = local_start |
| {} |
| |
| // test `else if let` |
| if opt == Some(None..None) { |
| } else if let x = opt.clone().map(|_| 1) { |
| //~^ WARN irrefutable `if let` pattern |
| } |
| |
| if opt == Some(None..None) { |
| } else if let x = opt.clone().map(|_| 1) |
| && x == Some(1) |
| {} |
| |
| if opt == Some(None..None) { |
| } else if opt.is_some() && let x = &opt |
| {} |
| |
| if opt == Some(None..None) { |
| } else { |
| if let x = opt.clone().map(|_| 1) && x == Some(1) |
| {} |
| } |
| |
| // test `if let guard` |
| match opt { |
| Some(ref first) if let second = first => {} |
| //~^ WARN irrefutable `if let` guard pattern |
| _ => {} |
| } |
| |
| match opt { |
| Some(ref first) |
| if let second = first |
| && let _third = second |
| && let v = 4 + 4 => {} |
| _ => {} |
| } |
| |
| match opt { |
| Some(ref first) |
| if let Range { start: local_start, end: _ } = first |
| && let None = local_start => {} |
| _ => {} |
| } |
| |
| match opt { |
| Some(ref first) |
| if let Range { start: Some(_), end: local_end } = first |
| && let v = local_end |
| && let w = v => {} |
| _ => {} |
| } |
| |
| // test `while let` |
| while let first = &opt {} |
| //~^ WARN irrefutable `while let` pattern |
| |
| while let first = &opt |
| && let (a, b) = (1, 2) |
| {} |
| |
| while let first = &opt |
| && let Some(second) = first |
| && let None = second.start |
| {} |
| |
| while let Some(ref first) = opt |
| && let second = first |
| && let _third = second |
| {} |
| |
| while let Some(ref first) = opt |
| && let Range { start: local_start, end: _ } = first |
| && let None = local_start |
| {} |
| } |