1 // check-pass
2 #![feature(never_type, exhaustive_patterns)]
3 #![warn(unreachable_code)]
4 #![warn(unreachable_patterns)]
5 
6 enum Void {}
7 
8 impl From<Void> for i32 {
from(v: Void) -> i329     fn from(v: Void) -> i32 {
10         match v {}
11     }
12 }
13 
bar(x: Result<!, i32>) -> Result<u32, i32>14 fn bar(x: Result<!, i32>) -> Result<u32, i32> {
15     x?
16 }
17 
foo(x: Result<!, i32>) -> Result<u32, i32>18 fn foo(x: Result<!, i32>) -> Result<u32, i32> {
19     let y = (match x { Ok(n) => Ok(n as u32), Err(e) => Err(e) })?;
20     //~^ WARN unreachable pattern
21     //~| WARN unreachable expression
22     Ok(y)
23 }
24 
qux(x: Result<u32, Void>) -> Result<u32, i32>25 fn qux(x: Result<u32, Void>) -> Result<u32, i32> {
26     Ok(x?)
27 }
28 
vom(x: Result<u32, Void>) -> Result<u32, i32>29 fn vom(x: Result<u32, Void>) -> Result<u32, i32> {
30     let y = (match x { Ok(n) => Ok(n), Err(e) => Err(e) })?;
31     //~^ WARN unreachable pattern
32     Ok(y)
33 }
34 
35 
main()36 fn main() {
37     let _ = bar(Err(123));
38     let _ = foo(Err(123));
39     let _ = qux(Ok(123));
40     let _ = vom(Ok(123));
41 }
42