| //@ aux-build:enums.rs |
| extern crate enums; |
| |
| use enums::{EmptyNonExhaustiveEnum, NonExhaustiveEnum}; |
| |
| fn empty(x: EmptyNonExhaustiveEnum) { |
| match x {} //~ ERROR type `EmptyNonExhaustiveEnum` is non-empty |
| match x { |
| _ => {}, // ok |
| } |
| } |
| |
| fn main() { |
| let enum_unit = NonExhaustiveEnum::Unit; |
| |
| match enum_unit { |
| //~^ ERROR non-exhaustive patterns: `_` not covered [E0004] |
| NonExhaustiveEnum::Unit => "first", |
| NonExhaustiveEnum::Tuple(_) => "second", |
| NonExhaustiveEnum::Struct { .. } => "third" |
| }; |
| |
| match enum_unit {}; |
| //~^ ERROR non-exhaustive patterns: `_` not covered [E0004] |
| |
| // Everything below this is expected to compile successfully. |
| |
| let enum_unit = NonExhaustiveEnum::Unit; |
| |
| match enum_unit { |
| NonExhaustiveEnum::Unit => 1, |
| NonExhaustiveEnum::Tuple(_) => 2, |
| // This particular arm tests that an enum marked as non-exhaustive |
| // will not error if its variants are matched exhaustively. |
| NonExhaustiveEnum::Struct { field } => field, |
| _ => 0 // no error with wildcard |
| }; |
| |
| match enum_unit { |
| _ => "no error with only wildcard" |
| }; |
| |
| // #53549: Check that variant constructors can still be called normally. |
| match NonExhaustiveEnum::Unit { |
| NonExhaustiveEnum::Unit => {}, |
| _ => {} |
| }; |
| |
| match NonExhaustiveEnum::Tuple(2) { |
| NonExhaustiveEnum::Tuple(2) => {}, |
| _ => {} |
| }; |
| |
| match (NonExhaustiveEnum::Unit {}) { |
| NonExhaustiveEnum::Unit {} => {}, |
| _ => {} |
| }; |
| |
| match (NonExhaustiveEnum::Tuple { 0: 2 }) { |
| NonExhaustiveEnum::Tuple { 0: 2 } => {}, |
| _ => {} |
| }; |
| |
| match (NonExhaustiveEnum::Struct { field: 2 }) { |
| NonExhaustiveEnum::Struct { field: 2 } => {}, |
| _ => {} |
| }; |
| |
| } |