Add a bunch more tests.
This commit is contained in:
parent
214f977fee
commit
1f0fb0391c
15 changed files with 506 additions and 5 deletions
|
|
@ -23,3 +23,11 @@ pub enum PartiallyInhabitedVariants {
|
|||
Tuple(u8),
|
||||
#[non_exhaustive] Struct { x: ! }
|
||||
}
|
||||
|
||||
pub struct IndirectUninhabitedEnum(UninhabitedEnum);
|
||||
|
||||
pub struct IndirectUninhabitedStruct(UninhabitedStruct);
|
||||
|
||||
pub struct IndirectUninhabitedTupleStruct(UninhabitedTupleStruct);
|
||||
|
||||
pub struct IndirectUninhabitedVariants(UninhabitedVariants);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,36 @@
|
|||
// aux-build:uninhabited.rs
|
||||
#![feature(never_type)]
|
||||
|
||||
extern crate uninhabited;
|
||||
|
||||
use uninhabited::{
|
||||
IndirectUninhabitedEnum,
|
||||
IndirectUninhabitedStruct,
|
||||
IndirectUninhabitedTupleStruct,
|
||||
IndirectUninhabitedVariants,
|
||||
};
|
||||
|
||||
struct A;
|
||||
|
||||
// This test checks that an empty match on a non-exhaustive uninhabited type through a level of
|
||||
// indirection from an extern crate will not compile.
|
||||
|
||||
fn cannot_empty_match_on_empty_enum_to_anything(x: IndirectUninhabitedEnum) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_empty_struct_to_anything(x: IndirectUninhabitedStruct) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_empty_tuple_struct_to_anything(x: IndirectUninhabitedTupleStruct) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_enum_with_empty_variants_struct_to_anything(
|
||||
x: IndirectUninhabitedVariants,
|
||||
) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
error[E0004]: non-exhaustive patterns: pattern `IndirectUninhabitedEnum` of type `uninhabited::IndirectUninhabitedEnum` is not handled
|
||||
--> $DIR/indirect_match.rs:19:11
|
||||
|
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: pattern `IndirectUninhabitedStruct` of type `uninhabited::IndirectUninhabitedStruct` is not handled
|
||||
--> $DIR/indirect_match.rs:23:11
|
||||
|
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: pattern `IndirectUninhabitedTupleStruct` of type `uninhabited::IndirectUninhabitedTupleStruct` is not handled
|
||||
--> $DIR/indirect_match.rs:27:11
|
||||
|
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: pattern `IndirectUninhabitedVariants` of type `uninhabited::IndirectUninhabitedVariants` is not handled
|
||||
--> $DIR/indirect_match.rs:33:11
|
||||
|
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0004`.
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
#![feature(never_type)]
|
||||
#![feature(non_exhaustive)]
|
||||
|
||||
#[non_exhaustive]
|
||||
pub enum UninhabitedEnum {
|
||||
}
|
||||
|
||||
#[non_exhaustive]
|
||||
pub struct UninhabitedStruct {
|
||||
_priv: !,
|
||||
}
|
||||
|
||||
#[non_exhaustive]
|
||||
pub struct UninhabitedTupleStruct(!);
|
||||
|
||||
pub enum UninhabitedVariants {
|
||||
#[non_exhaustive] Tuple(!),
|
||||
#[non_exhaustive] Struct { x: ! }
|
||||
}
|
||||
|
||||
pub struct IndirectUninhabitedEnum(UninhabitedEnum);
|
||||
|
||||
pub struct IndirectUninhabitedStruct(UninhabitedStruct);
|
||||
|
||||
pub struct IndirectUninhabitedTupleStruct(UninhabitedTupleStruct);
|
||||
|
||||
pub struct IndirectUninhabitedVariants(UninhabitedVariants);
|
||||
|
||||
struct A;
|
||||
|
||||
// This test checks that an empty match on a non-exhaustive uninhabited type through a level of
|
||||
// indirection from the defining crate will not compile without `#![feature(exhaustive_patterns)]`.
|
||||
|
||||
fn cannot_empty_match_on_empty_enum_to_anything(x: IndirectUninhabitedEnum) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_empty_struct_to_anything(x: IndirectUninhabitedStruct) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_empty_tuple_struct_to_anything(x: IndirectUninhabitedTupleStruct) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_enum_with_empty_variants_struct_to_anything(
|
||||
x: IndirectUninhabitedVariants,
|
||||
) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
error[E0004]: non-exhaustive patterns: pattern `IndirectUninhabitedEnum` of type `IndirectUninhabitedEnum` is not handled
|
||||
--> $DIR/indirect_match_same_crate.rs:35:11
|
||||
|
|
||||
LL | pub struct IndirectUninhabitedEnum(UninhabitedEnum);
|
||||
| ----------------------------------------------------
|
||||
| | |
|
||||
| | variant not covered
|
||||
| `IndirectUninhabitedEnum` defined here
|
||||
...
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: pattern `IndirectUninhabitedStruct` of type `IndirectUninhabitedStruct` is not handled
|
||||
--> $DIR/indirect_match_same_crate.rs:39:11
|
||||
|
|
||||
LL | pub struct IndirectUninhabitedStruct(UninhabitedStruct);
|
||||
| --------------------------------------------------------
|
||||
| | |
|
||||
| | variant not covered
|
||||
| `IndirectUninhabitedStruct` defined here
|
||||
...
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: pattern `IndirectUninhabitedTupleStruct` of type `IndirectUninhabitedTupleStruct` is not handled
|
||||
--> $DIR/indirect_match_same_crate.rs:43:11
|
||||
|
|
||||
LL | pub struct IndirectUninhabitedTupleStruct(UninhabitedTupleStruct);
|
||||
| ------------------------------------------------------------------
|
||||
| | |
|
||||
| | variant not covered
|
||||
| `IndirectUninhabitedTupleStruct` defined here
|
||||
...
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: pattern `IndirectUninhabitedVariants` of type `IndirectUninhabitedVariants` is not handled
|
||||
--> $DIR/indirect_match_same_crate.rs:49:11
|
||||
|
|
||||
LL | pub struct IndirectUninhabitedVariants(UninhabitedVariants);
|
||||
| ------------------------------------------------------------
|
||||
| | |
|
||||
| | variant not covered
|
||||
| `IndirectUninhabitedVariants` defined here
|
||||
...
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0004`.
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
// aux-build:uninhabited.rs
|
||||
#![deny(unreachable_patterns)]
|
||||
#![feature(exhaustive_patterns)]
|
||||
#![feature(never_type)]
|
||||
|
||||
extern crate uninhabited;
|
||||
|
||||
use uninhabited::{
|
||||
IndirectUninhabitedEnum,
|
||||
IndirectUninhabitedStruct,
|
||||
IndirectUninhabitedTupleStruct,
|
||||
IndirectUninhabitedVariants,
|
||||
};
|
||||
|
||||
struct A;
|
||||
|
||||
// This test checks that an empty match on a non-exhaustive uninhabited type through a level of
|
||||
// indirection from an extern crate will not compile. In particular, this enables the
|
||||
// `exhaustive_patterns` feature as this can change the branch used in the compiler to determine
|
||||
// this.
|
||||
|
||||
fn cannot_empty_match_on_empty_enum_to_anything(x: IndirectUninhabitedEnum) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_empty_struct_to_anything(x: IndirectUninhabitedStruct) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_empty_tuple_struct_to_anything(x: IndirectUninhabitedTupleStruct) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_enum_with_empty_variants_struct_to_anything(
|
||||
x: IndirectUninhabitedVariants,
|
||||
) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
error[E0004]: non-exhaustive patterns: type `uninhabited::IndirectUninhabitedEnum` is non-empty
|
||||
--> $DIR/indirect_match_with_exhaustive_patterns.rs:23:11
|
||||
|
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: type `uninhabited::IndirectUninhabitedStruct` is non-empty
|
||||
--> $DIR/indirect_match_with_exhaustive_patterns.rs:27:11
|
||||
|
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: type `uninhabited::IndirectUninhabitedTupleStruct` is non-empty
|
||||
--> $DIR/indirect_match_with_exhaustive_patterns.rs:31:11
|
||||
|
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: type `uninhabited::IndirectUninhabitedVariants` is non-empty
|
||||
--> $DIR/indirect_match_with_exhaustive_patterns.rs:37:11
|
||||
|
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0004`.
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
// compile-pass
|
||||
// skip-codegen
|
||||
#![deny(unreachable_patterns)]
|
||||
#![feature(exhaustive_patterns)]
|
||||
#![feature(never_type)]
|
||||
#![feature(non_exhaustive)]
|
||||
|
||||
#[non_exhaustive]
|
||||
pub enum UninhabitedEnum {
|
||||
}
|
||||
|
||||
#[non_exhaustive]
|
||||
pub struct UninhabitedStruct {
|
||||
_priv: !,
|
||||
}
|
||||
|
||||
#[non_exhaustive]
|
||||
pub struct UninhabitedTupleStruct(!);
|
||||
|
||||
pub enum UninhabitedVariants {
|
||||
#[non_exhaustive] Tuple(!),
|
||||
#[non_exhaustive] Struct { x: ! }
|
||||
}
|
||||
|
||||
pub struct IndirectUninhabitedEnum(UninhabitedEnum);
|
||||
|
||||
pub struct IndirectUninhabitedStruct(UninhabitedStruct);
|
||||
|
||||
pub struct IndirectUninhabitedTupleStruct(UninhabitedTupleStruct);
|
||||
|
||||
pub struct IndirectUninhabitedVariants(UninhabitedVariants);
|
||||
|
||||
struct A;
|
||||
|
||||
// This test checks that an empty match on a non-exhaustive uninhabited type from the defining crate
|
||||
// will compile. In particular, this enables the `exhaustive_patterns` feature as this can
|
||||
// change the branch used in the compiler to determine this.
|
||||
// Codegen is skipped because tests with long names can cause issues on Windows CI, see #60648.
|
||||
|
||||
fn cannot_empty_match_on_empty_enum_to_anything(x: IndirectUninhabitedEnum) -> A {
|
||||
match x {}
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_empty_struct_to_anything(x: IndirectUninhabitedStruct) -> A {
|
||||
match x {}
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_empty_tuple_struct_to_anything(x: IndirectUninhabitedTupleStruct) -> A {
|
||||
match x {}
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_enum_with_empty_variants_struct_to_anything(
|
||||
x: IndirectUninhabitedVariants,
|
||||
) -> A {
|
||||
match x {}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -5,6 +5,9 @@ extern crate uninhabited;
|
|||
|
||||
use uninhabited::{
|
||||
UninhabitedEnum,
|
||||
UninhabitedStruct,
|
||||
UninhabitedTupleStruct,
|
||||
UninhabitedVariants,
|
||||
};
|
||||
|
||||
struct A;
|
||||
|
|
@ -16,4 +19,16 @@ fn cannot_empty_match_on_empty_enum_to_anything(x: UninhabitedEnum) -> A {
|
|||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_empty_struct_to_anything(x: UninhabitedStruct) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_empty_tuple_struct_to_anything(x: UninhabitedTupleStruct) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_enum_with_empty_variants_struct_to_anything(x: UninhabitedVariants) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,35 @@
|
|||
error[E0004]: non-exhaustive patterns: type `uninhabited::UninhabitedEnum` is non-empty
|
||||
--> $DIR/match.rs:16:11
|
||||
--> $DIR/match.rs:19:11
|
||||
|
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error: aborting due to previous error
|
||||
error[E0004]: non-exhaustive patterns: pattern `UninhabitedStruct` of type `uninhabited::UninhabitedStruct` is not handled
|
||||
--> $DIR/match.rs:23:11
|
||||
|
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: pattern `UninhabitedTupleStruct` of type `uninhabited::UninhabitedTupleStruct` is not handled
|
||||
--> $DIR/match.rs:27:11
|
||||
|
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: multiple patterns of type `uninhabited::UninhabitedVariants` are not handled
|
||||
--> $DIR/match.rs:31:11
|
||||
|
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0004`.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
// compile-pass
|
||||
#![feature(never_type)]
|
||||
#![feature(non_exhaustive)]
|
||||
|
||||
|
|
@ -6,6 +5,19 @@
|
|||
pub enum UninhabitedEnum {
|
||||
}
|
||||
|
||||
#[non_exhaustive]
|
||||
pub struct UninhabitedStruct {
|
||||
_priv: !,
|
||||
}
|
||||
|
||||
#[non_exhaustive]
|
||||
pub struct UninhabitedTupleStruct(!);
|
||||
|
||||
pub enum UninhabitedVariants {
|
||||
#[non_exhaustive] Tuple(!),
|
||||
#[non_exhaustive] Struct { x: ! }
|
||||
}
|
||||
|
||||
struct A;
|
||||
|
||||
// This test checks that an empty match on a non-exhaustive uninhabited type from the defining crate
|
||||
|
|
@ -15,4 +27,16 @@ fn cannot_empty_match_on_empty_enum_to_anything(x: UninhabitedEnum) -> A {
|
|||
match x {}
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_empty_struct_to_anything(x: UninhabitedStruct) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_empty_tuple_struct_to_anything(x: UninhabitedTupleStruct) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_enum_with_empty_variants_struct_to_anything(x: UninhabitedVariants) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,49 @@
|
|||
error[E0004]: non-exhaustive patterns: pattern `UninhabitedStruct` of type `UninhabitedStruct` is not handled
|
||||
--> $DIR/match_same_crate.rs:31:11
|
||||
|
|
||||
LL | pub struct UninhabitedStruct {
|
||||
| - ----------------- variant not covered
|
||||
| _|
|
||||
| |
|
||||
LL | | _priv: !,
|
||||
LL | | }
|
||||
| |_- `UninhabitedStruct` defined here
|
||||
...
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: pattern `UninhabitedTupleStruct` of type `UninhabitedTupleStruct` is not handled
|
||||
--> $DIR/match_same_crate.rs:35:11
|
||||
|
|
||||
LL | pub struct UninhabitedTupleStruct(!);
|
||||
| -------------------------------------
|
||||
| | |
|
||||
| | variant not covered
|
||||
| `UninhabitedTupleStruct` defined here
|
||||
...
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: multiple patterns of type `UninhabitedVariants` are not handled
|
||||
--> $DIR/match_same_crate.rs:39:11
|
||||
|
|
||||
LL | / pub enum UninhabitedVariants {
|
||||
LL | | #[non_exhaustive] Tuple(!),
|
||||
| | ----- variant not covered
|
||||
LL | | #[non_exhaustive] Struct { x: ! }
|
||||
| | ------ variant not covered
|
||||
LL | | }
|
||||
| |_- `UninhabitedVariants` defined here
|
||||
...
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0004`.
|
||||
|
|
@ -7,6 +7,9 @@ extern crate uninhabited;
|
|||
|
||||
use uninhabited::{
|
||||
UninhabitedEnum,
|
||||
UninhabitedStruct,
|
||||
UninhabitedTupleStruct,
|
||||
UninhabitedVariants,
|
||||
};
|
||||
|
||||
struct A;
|
||||
|
|
@ -19,4 +22,16 @@ fn cannot_empty_match_on_empty_enum_to_anything(x: UninhabitedEnum) -> A {
|
|||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_empty_struct_to_anything(x: UninhabitedStruct) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_empty_tuple_struct_to_anything(x: UninhabitedTupleStruct) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_enum_with_empty_variants_struct_to_anything(x: UninhabitedVariants) -> A {
|
||||
match x {} //~ ERROR non-exhaustive patterns
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,35 @@
|
|||
error[E0004]: non-exhaustive patterns: type `uninhabited::UninhabitedEnum` is non-empty
|
||||
--> $DIR/match_with_exhaustive_patterns.rs:19:11
|
||||
--> $DIR/match_with_exhaustive_patterns.rs:22:11
|
||||
|
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error: aborting due to previous error
|
||||
error[E0004]: non-exhaustive patterns: type `uninhabited::UninhabitedStruct` is non-empty
|
||||
--> $DIR/match_with_exhaustive_patterns.rs:26:11
|
||||
|
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: type `uninhabited::UninhabitedTupleStruct` is non-empty
|
||||
--> $DIR/match_with_exhaustive_patterns.rs:30:11
|
||||
|
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error[E0004]: non-exhaustive patterns: type `uninhabited::UninhabitedVariants` is non-empty
|
||||
--> $DIR/match_with_exhaustive_patterns.rs:34:11
|
||||
|
|
||||
LL | match x {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0004`.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
// compile-pass
|
||||
// skip-codegen
|
||||
#![deny(unreachable_patterns)]
|
||||
#![feature(exhaustive_patterns)]
|
||||
#![feature(never_type)]
|
||||
|
|
@ -8,14 +9,40 @@
|
|||
pub enum UninhabitedEnum {
|
||||
}
|
||||
|
||||
#[non_exhaustive]
|
||||
pub struct UninhabitedStruct {
|
||||
_priv: !,
|
||||
}
|
||||
|
||||
#[non_exhaustive]
|
||||
pub struct UninhabitedTupleStruct(!);
|
||||
|
||||
pub enum UninhabitedVariants {
|
||||
#[non_exhaustive] Tuple(!),
|
||||
#[non_exhaustive] Struct { x: ! }
|
||||
}
|
||||
|
||||
struct A;
|
||||
|
||||
// This test checks that an empty match on a non-exhaustive uninhabited type from the defining crate
|
||||
// will compile. In particular, this enables the `exhaustive_patterns` feature as this can
|
||||
// change the branch used in the compiler to determine this.
|
||||
// Codegen is skipped because tests with long names can cause issues on Windows CI, see #60648.
|
||||
|
||||
fn cannot_empty_match_on_empty_enum_to_anything(x: UninhabitedEnum) -> A {
|
||||
match x {}
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_empty_struct_to_anything(x: UninhabitedStruct) -> A {
|
||||
match x {}
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_empty_tuple_struct_to_anything(x: UninhabitedTupleStruct) -> A {
|
||||
match x {}
|
||||
}
|
||||
|
||||
fn cannot_empty_match_on_enum_with_empty_variants_struct_to_anything(x: UninhabitedVariants) -> A {
|
||||
match x {}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue