61 lines
1.9 KiB
Rust
61 lines
1.9 KiB
Rust
//@ 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 => {}
|
|
}
|
|
}
|