//@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, }; }