| //@ run-pass | |
| #![allow(non_camel_case_types)] | |
| #![allow(dead_code)] | |
| //@ edition: 2018 | |
| #![feature(try_blocks)] | |
| struct catch {} | |
| pub fn main() { | |
| let catch_result: Option<_> = try { | |
| let x = 5; | |
| x | |
| }; | |
| assert_eq!(catch_result, Some(5)); | |
| let mut catch = true; | |
| while catch { catch = false; } | |
| assert_eq!(catch, false); | |
| catch = if catch { false } else { true }; | |
| assert_eq!(catch, true); | |
| match catch { | |
| _ => {} | |
| }; | |
| let catch_err: Result<_, i32> = try { | |
| Err(22)?; | |
| 1 | |
| }; | |
| assert_eq!(catch_err, Err(22)); | |
| let catch_okay: Result<i32, i32> = try { | |
| if false { Err(25)?; } | |
| Ok::<(), i32>(())?; | |
| 28 | |
| }; | |
| assert_eq!(catch_okay, Ok(28)); | |
| let catch_from_loop: Result<i32, i32> = try { | |
| for i in 0..10 { | |
| if i < 5 { Ok::<i32, i32>(i)?; } else { Err(i)?; } | |
| } | |
| 22 | |
| }; | |
| assert_eq!(catch_from_loop, Err(5)); | |
| let cfg_init; | |
| let _res: Result<(), ()> = try { | |
| cfg_init = 5; | |
| }; | |
| assert_eq!(cfg_init, 5); | |
| let cfg_init_2; | |
| let _res: Result<(), ()> = try { | |
| cfg_init_2 = 6; | |
| Err(())?; | |
| }; | |
| assert_eq!(cfg_init_2, 6); | |
| let my_string = "test".to_string(); | |
| let res: Result<&str, ()> = try { | |
| // Unfortunately, deref doesn't fire here (#49356) | |
| &my_string[..] | |
| }; | |
| assert_eq!(res, Ok("test")); | |
| let my_opt: Option<_> = try { () }; | |
| assert_eq!(my_opt, Some(())); | |
| let my_opt: Option<_> = try { }; | |
| assert_eq!(my_opt, Some(())); | |
| } |