| #![feature(never_patterns)] |
| #![feature(let_chains)] |
| #![allow(incomplete_features)] |
| #![deny(unreachable_patterns)] |
| |
| fn main() {} |
| |
| enum Void {} |
| |
| // Contrast with `./diverges.rs`: merely having an empty type around isn't enough to diverge. |
| |
| fn wild_void(_: Void) -> u32 {} |
| //~^ ERROR: mismatched types |
| |
| fn wild_let() -> u32 { |
| let ptr: *const Void = std::ptr::null(); |
| unsafe { |
| //~^ ERROR: mismatched types |
| let _ = *ptr; |
| } |
| } |
| |
| fn wild_match() -> u32 { |
| let ptr: *const Void = std::ptr::null(); |
| unsafe { |
| match *ptr { |
| _ => {} //~ ERROR: mismatched types |
| } |
| } |
| } |
| |
| fn binding_void(_x: Void) -> u32 {} |
| //~^ ERROR: mismatched types |
| |
| fn binding_let() -> u32 { |
| let ptr: *const Void = std::ptr::null(); |
| unsafe { |
| //~^ ERROR: mismatched types |
| let _x = *ptr; |
| } |
| } |
| |
| fn binding_match() -> u32 { |
| let ptr: *const Void = std::ptr::null(); |
| unsafe { |
| match *ptr { |
| _x => {} //~ ERROR: mismatched types |
| } |
| } |
| } |
| |
| // Don't confuse this with a `let !` statement. |
| fn let_chain(x: Void) -> u32 { |
| if let true = true && let ! = x {} |
| //~^ ERROR: mismatched types |
| } |