| //@ run-pass | |
| #![allow(dead_code)] | |
| pub fn main() { | |
| let x = Some(3); | |
| if let Some(y) = x { | |
| assert_eq!(y, 3); | |
| } else { | |
| panic!("`if let` panicked"); | |
| } | |
| let mut worked = false; | |
| if let Some(_) = x { | |
| worked = true; | |
| } | |
| assert!(worked); | |
| let clause: usize; | |
| if let None = Some("test") { | |
| clause = 1; | |
| } else if 4_usize > 5 { | |
| clause = 2; | |
| } else if let Ok(()) = Err::<(),&'static str>("test") { | |
| clause = 3; | |
| } else { | |
| clause = 4; | |
| } | |
| assert_eq!(clause, 4_usize); | |
| if 3 > 4 { | |
| panic!("bad math"); | |
| } else if let 1 = 2 { | |
| panic!("bad pattern match"); | |
| } | |
| enum Foo { | |
| One, | |
| Two(usize), | |
| Three(String, isize) | |
| } | |
| let foo = Foo::Three("three".to_string(), 42); | |
| if let Foo::One = foo { | |
| panic!("bad pattern match"); | |
| } else if let Foo::Two(_x) = foo { | |
| panic!("bad pattern match"); | |
| } else if let Foo::Three(s, _) = foo { | |
| assert_eq!(s, "three"); | |
| } else { | |
| panic!("bad else"); | |
| } | |
| if false { | |
| panic!("wat"); | |
| } else if let a@Foo::Two(_) = Foo::Two(42_usize) { | |
| if let Foo::Two(b) = a { | |
| assert_eq!(b, 42_usize); | |
| } else { | |
| panic!("panic in nested `if let`"); | |
| } | |
| } | |
| } |