| #![warn(clippy::match_single_binding)] | |
| #![allow(clippy::no_effect, clippy::toplevel_ref_arg)] | |
| #![expect(clippy::let_unit_value, clippy::useless_vec)] | |
| struct Point { | |
| x: i32, | |
| y: i32, | |
| } | |
| fn coords() -> Point { | |
| Point { x: 1, y: 2 } | |
| } | |
| macro_rules! foo { | |
| ($param:expr) => { | |
| match $param { | |
| _ => println!("whatever"), | |
| } | |
| }; | |
| } | |
| fn main() { | |
| let a = 1; | |
| let b = 2; | |
| let c = 3; | |
| // Lint | |
| match (a, b, c) { | |
| //~^ match_single_binding | |
| (x, y, z) => { | |
| println!("{x} {y} {z}"); | |
| }, | |
| } | |
| // Lint | |
| match (a, b, c) { | |
| //~^ match_single_binding | |
| (x, y, z) => println!("{x} {y} {z}"), | |
| } | |
| // Ok | |
| foo!(a); | |
| // Ok | |
| match a { | |
| 2 => println!("2"), | |
| _ => println!("Not 2"), | |
| } | |
| // Ok | |
| let d = Some(5); | |
| match d { | |
| Some(d) => println!("{d}"), | |
| _ => println!("None"), | |
| } | |
| // Lint | |
| match a { | |
| //~^ match_single_binding | |
| _ => println!("whatever"), | |
| } | |
| // Lint | |
| match a { | |
| //~^ match_single_binding | |
| _ => { | |
| let x = 29; | |
| println!("x has a value of {x}"); | |
| }, | |
| } | |
| // Lint | |
| match a { | |
| //~^ match_single_binding | |
| _ => { | |
| let e = 5 * a; | |
| if e >= 5 { | |
| println!("e is superior to 5"); | |
| } | |
| }, | |
| } | |
| // Lint | |
| let p = Point { x: 0, y: 7 }; | |
| match p { | |
| //~^ match_single_binding | |
| Point { x, y } => println!("Coords: ({x}, {y})"), | |
| } | |
| // Lint | |
| match p { | |
| //~^ match_single_binding | |
| Point { x: x1, y: y1 } => println!("Coords: ({x1}, {y1})"), | |
| } | |
| // Lint | |
| let x = 5; | |
| match x { | |
| //~^ match_single_binding | |
| ref r => println!("Got a reference to {r}"), | |
| } | |
| // Lint | |
| let mut x = 5; | |
| match x { | |
| //~^ match_single_binding | |
| ref mut mr => println!("Got a mutable reference to {mr}"), | |
| } | |
| // Lint | |
| let product = match coords() { | |
| //~^ match_single_binding | |
| Point { x, y } => x * y, | |
| }; | |
| // Lint | |
| let v = vec![Some(1), Some(2), Some(3), Some(4)]; | |
| #[allow(clippy::let_and_return)] | |
| let _ = v | |
| .iter() | |
| .map(|i| match i.unwrap() { | |
| //~^ match_single_binding | |
| unwrapped => unwrapped, | |
| }) | |
| .collect::<Vec<u8>>(); | |
| // Ok | |
| let x = 1; | |
| match x { | |
| #[cfg(disabled_feature)] | |
| 0 => println!("Disabled branch"), | |
| _ => println!("Enabled branch"), | |
| } | |
| // Ok | |
| let x = 1; | |
| let y = 1; | |
| match match y { | |
| 0 => 1, | |
| _ => 2, | |
| } { | |
| #[cfg(disabled_feature)] | |
| 0 => println!("Array index start"), | |
| _ => println!("Not an array index start"), | |
| } | |
| // Lint | |
| let x = 1; | |
| match x { | |
| //~^ match_single_binding | |
| // => | |
| _ => println!("Not an array index start"), | |
| } | |
| } | |
| fn issue_8723() { | |
| let (mut val, idx) = ("a b", 1); | |
| val = match val.split_at(idx) { | |
| //~^ match_single_binding | |
| (pre, suf) => { | |
| println!("{pre}"); | |
| suf | |
| }, | |
| }; | |
| let _ = val; | |
| } | |
| fn side_effects() {} | |
| fn issue_9575() { | |
| let _ = || match side_effects() { | |
| //~^ match_single_binding | |
| _ => println!("Needs curlies"), | |
| }; | |
| } | |
| fn issue_9725(r: Option<u32>) { | |
| match r { | |
| //~^ match_single_binding | |
| x => match x { | |
| Some(_) => { | |
| println!("Some"); | |
| }, | |
| None => { | |
| println!("None"); | |
| }, | |
| }, | |
| }; | |
| } | |
| fn issue_10447() -> usize { | |
| match 1 { | |
| //~^ match_single_binding | |
| _ => (), | |
| } | |
| let a = match 1 { | |
| //~^ match_single_binding | |
| _ => (), | |
| }; | |
| match 1 { | |
| //~^ match_single_binding | |
| _ => side_effects(), | |
| } | |
| let b = match 1 { | |
| //~^ match_single_binding | |
| _ => side_effects(), | |
| }; | |
| match 1 { | |
| //~^ match_single_binding | |
| _ => println!("1"), | |
| } | |
| let c = match 1 { | |
| //~^ match_single_binding | |
| _ => println!("1"), | |
| }; | |
| let in_expr = [ | |
| match 1 { | |
| //~^ match_single_binding | |
| _ => (), | |
| }, | |
| match 1 { | |
| //~^ match_single_binding | |
| _ => side_effects(), | |
| }, | |
| match 1 { | |
| //~^ match_single_binding | |
| _ => println!("1"), | |
| }, | |
| ]; | |
| 2 | |
| } | |
| fn issue14634() { | |
| macro_rules! id { | |
| ($i:ident) => { | |
| $i | |
| }; | |
| } | |
| match dbg!(3) { | |
| _ => println!("here"), | |
| } | |
| //~^^^ match_single_binding | |
| match dbg!(3) { | |
| id!(a) => println!("found {a}"), | |
| } | |
| //~^^^ match_single_binding | |
| let id!(_a) = match dbg!(3) { | |
| id!(b) => dbg!(b + 1), | |
| }; | |
| //~^^^ match_single_binding | |
| } | |
| mod issue14991 { | |
| struct AnnoConstWOBlock { | |
| inner: [(); match 1 { | |
| //~^ match_single_binding | |
| _n => 42, | |
| }], | |
| } | |
| struct AnnoConstWBlock { | |
| inner: [(); { | |
| match 1 { | |
| //~^ match_single_binding | |
| _n => 42, | |
| } | |
| }], | |
| } | |
| } | |
| mod issue15018 { | |
| fn used_later(a: i32, b: i32, c: i32) { | |
| let x = 1; | |
| match (a, b, c) { | |
| //~^ match_single_binding | |
| (x, y, z) => println!("{x} {y} {z}"), | |
| } | |
| println!("x = {x}"); | |
| } | |
| fn not_used_later(a: i32, b: i32, c: i32) { | |
| match (a, b, c) { | |
| //~^ match_single_binding | |
| (x, y, z) => println!("{x} {y} {z}"), | |
| } | |
| } | |
| #[allow(irrefutable_let_patterns)] | |
| fn not_used_later_but_shadowed(a: i32, b: i32, c: i32) { | |
| match (a, b, c) { | |
| //~^ match_single_binding | |
| (x, y, z) => println!("{x} {y} {z}"), | |
| } | |
| let x = 1; | |
| println!("x = {x}"); | |
| } | |
| #[allow(irrefutable_let_patterns)] | |
| fn not_used_later_but_shadowed_nested(a: i32, b: i32, c: i32) { | |
| match (a, b, c) { | |
| //~^ match_single_binding | |
| (x, y, z) => println!("{x} {x} {y}"), | |
| } | |
| if let (x, y, z) = (a, b, c) { | |
| println!("{x} {y} {z}") | |
| } | |
| { | |
| let x: i32 = 1; | |
| match (a, b, c) { | |
| //~^ match_single_binding | |
| (x, y, z) => println!("{x} {y} {z}"), | |
| } | |
| if let (x, y, z) = (a, x, c) { | |
| println!("{x} {y} {z}") | |
| } | |
| } | |
| { | |
| match (a, b, c) { | |
| //~^ match_single_binding | |
| (x, y, z) => println!("{x} {y} {z}"), | |
| } | |
| let fn_ = |y| { | |
| println!("{a} {b} {y}"); | |
| }; | |
| fn_(c); | |
| } | |
| } | |
| } | |
| #[allow(clippy::short_circuit_statement)] | |
| fn issue15269(a: usize, b: usize, c: usize) -> bool { | |
| a < b | |
| && match b { | |
| //~^ match_single_binding | |
| b => b < c, | |
| }; | |
| a < b | |
| && match (a, b) { | |
| //~^ match_single_binding | |
| (a, b) => b < c, | |
| } | |
| } | |
| #[allow( | |
| irrefutable_let_patterns, | |
| clippy::blocks_in_conditions, | |
| clippy::unused_unit, | |
| clippy::let_unit_value, | |
| clippy::unit_arg, | |
| clippy::unnecessary_operation | |
| )] | |
| fn issue15537(a: i32) -> ((), (), ()) { | |
| let y = ( | |
| { todo!() }, | |
| match { a } { | |
| //~^ match_single_binding | |
| _ => (), | |
| }, | |
| (), | |
| ); | |
| let y = [ | |
| { todo!() }, | |
| match { a } { | |
| //~^ match_single_binding | |
| _ => (), | |
| }, | |
| (), | |
| ]; | |
| fn call(x: (), y: (), z: ()) {} | |
| let y = call( | |
| { todo!() }, | |
| match { a } { | |
| //~^ match_single_binding | |
| _ => (), | |
| }, | |
| (), | |
| ); | |
| struct Foo; | |
| impl Foo { | |
| fn method(&self, x: (), y: (), z: ()) {} | |
| } | |
| let x = Foo; | |
| x.method( | |
| { todo!() }, | |
| match { a } { | |
| //~^ match_single_binding | |
| _ => (), | |
| }, | |
| (), | |
| ); | |
| -match { a } { | |
| //~^ match_single_binding | |
| _ => 1, | |
| }; | |
| _ = match { a } { | |
| //~^ match_single_binding | |
| _ => 1, | |
| }; | |
| if let x = match { a } { | |
| //~^ match_single_binding | |
| _ => 1, | |
| } {} | |
| if match { a } { | |
| //~^ match_single_binding | |
| _ => true, | |
| } { | |
| todo!() | |
| } | |
| [1, 2, 3][match { a } { | |
| //~^ match_single_binding | |
| _ => 1usize, | |
| }]; | |
| todo!() | |
| } |