| //@aux-build:non-exhaustive-enum.rs | |
| #![allow( | |
| clippy::manual_unwrap_or_default, | |
| clippy::manual_unwrap_or, | |
| clippy::redundant_pattern_matching | |
| )] | |
| #![warn(clippy::unneeded_struct_pattern)] | |
| extern crate non_exhaustive_enum; | |
| use non_exhaustive_enum::*; | |
| fn noop() {} | |
| fn main() { | |
| match Some(114514) { | |
| Some(v) => v, | |
| None => 0, | |
| //~^ unneeded_struct_pattern | |
| }; | |
| match Some(1919810) { | |
| Some(v) => v, | |
| None => 0, | |
| //~^ unneeded_struct_pattern | |
| }; | |
| match Some(123456) { | |
| Some(v) => v, | |
| None => 0, | |
| }; | |
| match Some(Some(123456)) { | |
| Some(Some(v)) => v, | |
| Some(None) => 0, | |
| //~^ unneeded_struct_pattern | |
| None => 0, | |
| //~^ unneeded_struct_pattern | |
| }; | |
| if let None = Some(0) {} | |
| //~^ unneeded_struct_pattern | |
| if let None = Some(0) {} | |
| //~^ unneeded_struct_pattern | |
| if let Some(None) = Some(Some(0)) {} | |
| //~^ unneeded_struct_pattern | |
| let None = Some(0) else { panic!() }; | |
| //~^ unneeded_struct_pattern | |
| let None = Some(0) else { panic!() }; | |
| //~^ unneeded_struct_pattern | |
| let Some(None) = Some(Some(0)) else { panic!() }; | |
| //~^ unneeded_struct_pattern | |
| enum Custom { | |
| HasFields { | |
| field: i32, | |
| }, | |
| HasBracketsNoFields {}, | |
| NoBrackets, | |
| #[non_exhaustive] | |
| NoBracketsNonExhaustive, | |
| Init, | |
| }; | |
| match Custom::Init { | |
| Custom::HasFields { field: value } => value, | |
| Custom::HasBracketsNoFields {} => 0, | |
| Custom::NoBrackets => 0, //~ unneeded_struct_pattern | |
| Custom::NoBracketsNonExhaustive => 0, //~ unneeded_struct_pattern | |
| _ => 0, | |
| }; | |
| match Custom::Init { | |
| Custom::HasFields { field: value } => value, | |
| Custom::HasBracketsNoFields { .. } => 0, | |
| Custom::NoBrackets => 0, //~ unneeded_struct_pattern | |
| Custom::NoBracketsNonExhaustive => 0, //~ unneeded_struct_pattern | |
| _ => 0, | |
| }; | |
| match Custom::Init { | |
| Custom::NoBrackets if true => 0, //~ unneeded_struct_pattern | |
| _ => 0, | |
| }; | |
| match Custom::Init { | |
| Custom::NoBrackets | Custom::NoBracketsNonExhaustive => 0, | |
| //~^ unneeded_struct_pattern | |
| //~| unneeded_struct_pattern | |
| _ => 0, | |
| }; | |
| if let Custom::HasFields { field: value } = Custom::Init { | |
| noop(); | |
| } | |
| if let Custom::HasBracketsNoFields {} = Custom::Init { | |
| noop(); | |
| } | |
| if let Custom::HasBracketsNoFields { .. } = Custom::Init { | |
| noop(); | |
| } | |
| if let Custom::NoBrackets = Custom::Init { | |
| //~^ unneeded_struct_pattern | |
| noop(); | |
| } | |
| if let Custom::NoBrackets = Custom::Init { | |
| //~^ unneeded_struct_pattern | |
| noop(); | |
| } | |
| if let Custom::NoBrackets | Custom::NoBracketsNonExhaustive = Custom::Init { | |
| //~^ unneeded_struct_pattern | |
| //~| unneeded_struct_pattern | |
| noop(); | |
| } | |
| if let Custom::NoBracketsNonExhaustive = Custom::Init { | |
| //~^ unneeded_struct_pattern | |
| noop(); | |
| } | |
| if let Custom::NoBracketsNonExhaustive = Custom::Init { | |
| //~^ unneeded_struct_pattern | |
| noop(); | |
| } | |
| let Custom::HasFields { field: value } = Custom::Init else { | |
| panic!() | |
| }; | |
| let Custom::HasBracketsNoFields {} = Custom::Init else { | |
| panic!() | |
| }; | |
| let Custom::HasBracketsNoFields { .. } = Custom::Init else { | |
| panic!() | |
| }; | |
| let Custom::NoBrackets = Custom::Init else { panic!() }; //~ unneeded_struct_pattern | |
| let Custom::NoBrackets = Custom::Init else { | |
| //~^ unneeded_struct_pattern | |
| panic!() | |
| }; | |
| let Custom::NoBracketsNonExhaustive = Custom::Init else { | |
| //~^ unneeded_struct_pattern | |
| panic!() | |
| }; | |
| let Custom::NoBracketsNonExhaustive = Custom::Init else { | |
| //~^ unneeded_struct_pattern | |
| panic!() | |
| }; | |
| enum Refutable { | |
| Variant, | |
| } | |
| fn pat_in_fn_param_1(Refutable::Variant: Refutable) {} //~ unneeded_struct_pattern | |
| fn pat_in_fn_param_2(Refutable::Variant: Refutable) {} //~ unneeded_struct_pattern | |
| for Refutable::Variant in [] {} //~ unneeded_struct_pattern | |
| for Refutable::Variant in [] {} //~ unneeded_struct_pattern | |
| } | |
| fn external_crate() { | |
| use ExtNonExhaustiveVariant::*; | |
| match ExhaustiveUnit { | |
| // Expected | |
| ExhaustiveUnit => 0, | |
| _ => 0, | |
| }; | |
| match ExhaustiveUnit { | |
| // Exhaustive variant | |
| ExhaustiveUnit => 0, //~ unneeded_struct_pattern | |
| _ => 0, | |
| }; | |
| match ExhaustiveUnit { | |
| // Exhaustive variant | |
| ExhaustiveUnit => 0, //~ unneeded_struct_pattern | |
| _ => 0, | |
| }; | |
| match ExhaustiveUnit { | |
| ExhaustiveUnit => 0, | |
| // vvvvv Non-exhaustive variants, should all be ignored | |
| Unit { .. } => 0, | |
| Tuple { 0: field, .. } => field, | |
| StructNoField { .. } => 0, | |
| Struct { field, .. } => field, | |
| _ => 0, | |
| }; | |
| } |