Skip to content

Commit

Permalink
Test empty types better
Browse files Browse the repository at this point in the history
  • Loading branch information
Nadrieril committed Dec 8, 2023
1 parent f967532 commit 4e376cc
Show file tree
Hide file tree
Showing 11 changed files with 2,606 additions and 502 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
error: unreachable pattern
--> $DIR/empty-match-check-notes.rs:17:9
|
LL | _ => {}
| ^
|
note: the lint level is defined here
--> $DIR/empty-match-check-notes.rs:7:9
|
LL | #![deny(unreachable_patterns)]
| ^^^^^^^^^^^^^^^^^^^^

error: unreachable pattern
--> $DIR/empty-match-check-notes.rs:20:9
|
LL | _ if false => {}
| ^

error: unreachable pattern
--> $DIR/empty-match-check-notes.rs:27:9
|
LL | _ => {}
| ^

error: unreachable pattern
--> $DIR/empty-match-check-notes.rs:30:9
|
LL | _ if false => {}
| ^

error[E0005]: refutable pattern in local binding
--> $DIR/empty-match-check-notes.rs:35:9
|
LL | let None = x;
| ^^^^ pattern `Some(_)` not covered
|
= note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant
= note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html
= note: pattern `Some(_)` is currently uninhabited, but this variant contains private fields which may become inhabited in the future
= note: the matched value is of type `Option<SecretlyUninhabitedForeignStruct>`
help: you might want to use `if let` to ignore the variant that isn't matched
|
LL | if let None = x { todo!() };
| ++ +++++++++++

error[E0004]: non-exhaustive patterns: `_` not covered
--> $DIR/empty-match-check-notes.rs:45:11
|
LL | match 0u8 {
| ^^^ pattern `_` not covered
|
= note: the matched value is of type `u8`
= note: match arms with guards don't count towards exhaustivity
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
|
LL ~ _ if false => {},
LL + _ => todo!()
|

error: aborting due to 6 previous errors

Some errors have detailed explanations: E0004, E0005.
For more information about an error, try `rustc --explain E0004`.
62 changes: 62 additions & 0 deletions tests/ui/pattern/usefulness/empty-match-check-notes.normal.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
error: unreachable pattern
--> $DIR/empty-match-check-notes.rs:17:9
|
LL | _ => {}
| ^
|
note: the lint level is defined here
--> $DIR/empty-match-check-notes.rs:7:9
|
LL | #![deny(unreachable_patterns)]
| ^^^^^^^^^^^^^^^^^^^^

error: unreachable pattern
--> $DIR/empty-match-check-notes.rs:20:9
|
LL | _ if false => {}
| ^

error: unreachable pattern
--> $DIR/empty-match-check-notes.rs:27:9
|
LL | _ => {}
| ^

error: unreachable pattern
--> $DIR/empty-match-check-notes.rs:30:9
|
LL | _ if false => {}
| ^

error[E0005]: refutable pattern in local binding
--> $DIR/empty-match-check-notes.rs:35:9
|
LL | let None = x;
| ^^^^ pattern `Some(_)` not covered
|
= note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant
= note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html
= note: the matched value is of type `Option<SecretlyUninhabitedForeignStruct>`
help: you might want to use `if let` to ignore the variant that isn't matched
|
LL | if let None = x { todo!() };
| ++ +++++++++++

error[E0004]: non-exhaustive patterns: `_` not covered
--> $DIR/empty-match-check-notes.rs:45:11
|
LL | match 0u8 {
| ^^^ pattern `_` not covered
|
= note: the matched value is of type `u8`
= note: match arms with guards don't count towards exhaustivity
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
|
LL ~ _ if false => {},
LL + _ => todo!()
|

error: aborting due to 6 previous errors

Some errors have detailed explanations: E0004, E0005.
For more information about an error, try `rustc --explain E0004`.
52 changes: 52 additions & 0 deletions tests/ui/pattern/usefulness/empty-match-check-notes.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// 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
}
match x {
_ if false => {} //~ ERROR unreachable pattern
}
}

fn empty_foreign_enum(x: empty::EmptyForeignEnum) {
match x {} // ok
match x {
_ => {} //~ ERROR unreachable pattern
}
match x {
_ if false => {} //~ ERROR unreachable pattern
}
}

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
//[exhaustive_patterns]~| 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 pattern `_` not covered
_ if false => {}
}
}
Loading

0 comments on commit 4e376cc

Please sign in to comment.