| //@ aux-build:empty.rs | |
| //@ revisions: normal exhaustive_patterns | |
| // | |
| // This tests a match with no arms on various types, and checks NOTEs. | |
| #![feature(never_type)] | |
| #![cfg_attr(exhaustive_patterns, feature(exhaustive_patterns))] | |
| #![deny(unreachable_patterns)] | |
| //~^ NOTE the lint level is defined here | |
| extern crate empty; | |
| enum EmptyEnum {} | |
| fn empty_enum(x: EmptyEnum) { | |
| match x {} // ok | |
| match x { | |
| _ => {} //~ ERROR unreachable pattern | |
| //~^ NOTE matches no values | |
| //~| NOTE to learn more about uninhabited types, see | |
| } | |
| match x { | |
| _ if false => {} //~ ERROR unreachable pattern | |
| //~^ NOTE matches no values | |
| //~| NOTE to learn more about uninhabited types, see | |
| } | |
| } | |
| fn empty_foreign_enum(x: empty::EmptyForeignEnum) { | |
| match x {} // ok | |
| match x { | |
| _ => {} //~ ERROR unreachable pattern | |
| //~^ NOTE matches no values | |
| //~| NOTE to learn more about uninhabited types, see | |
| } | |
| match x { | |
| _ if false => {} //~ ERROR unreachable pattern | |
| //~^ NOTE matches no values | |
| //~| NOTE to learn more about uninhabited types, see | |
| } | |
| } | |
| fn empty_foreign_enum_private(x: &Option<empty::SecretlyUninhabitedForeignStruct>) { | |
| let None = *x; | |
| //~^ ERROR refutable pattern in local binding | |
| //~| NOTE `let` bindings require an "irrefutable pattern" | |
| //~| NOTE for more information, visit | |
| //~| NOTE the matched value is of type | |
| //~| NOTE pattern `Some(_)` not covered | |
| //~| NOTE currently uninhabited, but this variant contains private fields | |
| } | |
| fn main() { | |
| match 0u8 { | |
| //~^ ERROR not covered | |
| //~| NOTE the matched value is of type | |
| //~| NOTE match arms with guards don't count towards exhaustivity | |
| //~| NOTE not covered | |
| _ if false => {} | |
| } | |
| } |