//@ check-pass //@ edition: 2018 #![feature(never_patterns)] #![allow(incomplete_features)] #![deny(unreachable_patterns)] fn main() {} enum Void {} // A never pattern alone diverges. fn never_arg(!: Void) -> ! {} fn never_arg_returns_anything(!: Void) -> T {} fn ref_never_arg(&!: &Void) -> ! {} fn never_let() -> ! { let ptr: *const Void = std::ptr::null(); unsafe { let ! = *ptr; } } fn never_match() -> ! { let ptr: *const Void = std::ptr::null(); unsafe { match *ptr { ! }; } // Ensures this typechecks because of divergence and not the type of the match expression. println!(); } // Note: divergence is not detected for async fns when the `!` is in the argument (#120240). async fn async_let(x: Void) -> ! { let ! = x; }