//@ run-pass

#![allow(non_camel_case_types)]
#![allow(dead_code)]
//@ compile-flags: --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(()));
}
