mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 15:23:46 +00:00
100 lines
2.3 KiB
Rust
100 lines
2.3 KiB
Rust
#![feature(never_patterns)]
|
|
#![allow(incomplete_features)]
|
|
|
|
enum Void {}
|
|
|
|
fn main() {}
|
|
|
|
// The classic use for empty types.
|
|
fn safe_unwrap_result<T>(res: Result<T, Void>) {
|
|
let Ok(_x) = res;
|
|
// FIXME(never_patterns): These should be allowed
|
|
let (Ok(_x) | Err(!)) = &res;
|
|
//~^ ERROR: is not bound in all patterns
|
|
let (Ok(_x) | Err(&!)) = res.as_ref();
|
|
//~^ ERROR: is not bound in all patterns
|
|
}
|
|
|
|
// Check we only accept `!` where we want to.
|
|
fn never_pattern_location(void: Void) {
|
|
// FIXME(never_patterns): Don't accept on a non-empty type.
|
|
match Some(0) {
|
|
None => {}
|
|
Some(!),
|
|
}
|
|
// FIXME(never_patterns): Don't accept on an arbitrary type, even if there are no more branches.
|
|
match () {
|
|
() => {}
|
|
!,
|
|
}
|
|
// FIXME(never_patterns): Don't accept even on an empty branch.
|
|
match None::<Void> {
|
|
None => {}
|
|
!,
|
|
}
|
|
// FIXME(never_patterns): Let alone if the emptiness is behind a reference.
|
|
match None::<&Void> {
|
|
None => {}
|
|
!,
|
|
}
|
|
// Participate in match ergonomics.
|
|
match &void {
|
|
!
|
|
}
|
|
match &&void {
|
|
!
|
|
}
|
|
match &&void {
|
|
&!
|
|
}
|
|
match &None::<Void> {
|
|
None => {}
|
|
Some(!)
|
|
}
|
|
match None::<&Void> {
|
|
None => {}
|
|
Some(!),
|
|
}
|
|
// Accept on a composite empty type.
|
|
match None::<&(u32, Void)> {
|
|
None => {}
|
|
Some(&!),
|
|
}
|
|
// Accept on an simple empty type.
|
|
match None::<Void> {
|
|
None => {}
|
|
Some(!),
|
|
}
|
|
match None::<&Void> {
|
|
None => {}
|
|
Some(&!),
|
|
}
|
|
match None::<&(u32, Void)> {
|
|
None => {}
|
|
Some(&(_, !)),
|
|
}
|
|
}
|
|
|
|
fn never_and_bindings() {
|
|
let x: Result<bool, &(u32, Void)> = Ok(false);
|
|
|
|
// FIXME(never_patterns): Never patterns in or-patterns don't need to share the same bindings.
|
|
match x {
|
|
Ok(_x) | Err(&!) => {}
|
|
//~^ ERROR: is not bound in all patterns
|
|
}
|
|
let (Ok(_x) | Err(&!)) = x;
|
|
//~^ ERROR: is not bound in all patterns
|
|
|
|
// FIXME(never_patterns): A never pattern mustn't have bindings.
|
|
match x {
|
|
Ok(_) => {}
|
|
Err(&(_b, !)),
|
|
}
|
|
match x {
|
|
Ok(_a) | Err(&(_b, !)) => {}
|
|
//~^ ERROR: is not bound in all patterns
|
|
//~| ERROR: is not bound in all patterns
|
|
}
|
|
}
|