//@aux-build:non-exhaustive-enum.rs #![allow( clippy::manual_unwrap_or_default, clippy::manual_unwrap_or, clippy::redundant_pattern_matching, clippy::no_effect )] #![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, _ => 0, }; match Custom::Init { Custom::HasFields { field: value } => value, Custom::HasBracketsNoFields { .. } => 0, _ => 0, }; 0; //~^^^ match_single_binding 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 { //~^ 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 external_crate() { use ExtNonExhaustiveVariant::*; match ExhaustiveUnit { // Expected ExhaustiveUnit => 0, _ => 0, }; 0; 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, }; }