| //@ run-pass |
| // adapted from tests/ui/binding/if-let.rs |
| |
| #![allow(dead_code)] |
| |
| fn none() -> bool { |
| let None = Some("test") else { |
| return true; |
| }; |
| false |
| } |
| |
| fn ok() -> bool { |
| let Ok(()) = Err::<(),&'static str>("test") else { |
| return true; |
| }; |
| false |
| } |
| |
| pub fn main() { |
| let x = Some(3); |
| let Some(y) = x else { |
| panic!("let-else panicked"); |
| }; |
| assert_eq!(y, 3); |
| let Some(_) = x else { |
| panic!("bad match"); |
| }; |
| assert!(none()); |
| assert!(ok()); |
| |
| assert!((|| { |
| let 1 = 2 else { |
| return true; |
| }; |
| false |
| })()); |
| |
| enum Foo { |
| One, |
| Two(usize), |
| Three(String, isize), |
| } |
| |
| let foo = Foo::Three("three".to_string(), 42); |
| let one = || { |
| let Foo::One = foo else { |
| return true; |
| }; |
| false |
| }; |
| assert!(one()); |
| let two = || { |
| let Foo::Two(_x) = foo else { |
| return true; |
| }; |
| false |
| }; |
| assert!(two()); |
| let three = || { |
| let Foo::Three(s, _x) = foo else { |
| return false; |
| }; |
| s == "three" |
| }; |
| assert!(three()); |
| |
| let a@Foo::Two(_) = Foo::Two(42_usize) else { |
| panic!("bad match") |
| }; |
| let Foo::Two(b) = a else { |
| panic!("panic in nested `if let`"); |
| }; |
| assert_eq!(b, 42_usize); |
| } |