| // Check that never patterns require the feature gate. |
| use std::ptr::NonNull; |
| |
| enum Void {} |
| |
| fn main() { |
| let res: Result<u32, Void> = Ok(0); |
| let (Ok(_x) | Err(&!)) = res.as_ref(); |
| //~^ ERROR `!` patterns are experimental |
| |
| unsafe { |
| let ptr: *const Void = NonNull::dangling().as_ptr(); |
| match *ptr { |
| ! |
| //~^ ERROR `!` patterns are experimental |
| } |
| // Check that the gate operates even behind `cfg`. |
| #[cfg(FALSE)] |
| match *ptr { |
| ! |
| //~^ ERROR `!` patterns are experimental |
| } |
| #[cfg(FALSE)] |
| match *ptr { |
| ! => {} |
| //~^ ERROR `!` patterns are experimental |
| } |
| } |
| |
| // Correctly gate match arms with no body. |
| match Some(0) { |
| None => {} |
| Some(_), |
| //~^ ERROR unexpected `,` in pattern |
| } |
| match Some(0) { |
| None => {} |
| Some(_) |
| //~^ ERROR `match` arm with no body |
| } |
| match Some(0) { |
| _ => {} |
| Some(_) if false, |
| //~^ ERROR `match` arm with no body |
| Some(_) if false |
| //~^ ERROR `match` arm with no body |
| } |
| match res { |
| Ok(_) => {} |
| Err(!), |
| //~^ ERROR `!` patterns are experimental |
| } |
| match res { |
| Err(!) if false, |
| //~^ ERROR `!` patterns are experimental |
| //~| ERROR a guard on a never pattern will never be run |
| _ => {} |
| } |
| |
| // Check that the gate operates even behind `cfg`. |
| match Some(0) { |
| None => {} |
| #[cfg(FALSE)] |
| Some(_) |
| //~^ ERROR `match` arm with no body |
| } |
| match Some(0) { |
| _ => {} |
| #[cfg(FALSE)] |
| Some(_) if false |
| //~^ ERROR `match` arm with no body |
| } |
| } |