rust/tests/ui/pattern/usefulness/empty-match-check-notes.rs
2024-08-19 21:57:37 +02:00

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 => {}
}
}