| //@ 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`"); |
| } |
| } |
| } |