// Test unreachable_code lint for `try {}` block ok-wrapping. See issues #54165, #63324.

//@ edition: 2018
//@ check-pass
#![feature(try_blocks)]
#![warn(unreachable_code)]

fn err() -> Result<u32, ()> {
    Err(())
}

// In the following cases unreachable code is autogenerated and should not be reported.

fn test_ok_wrapped_divergent_expr_1() {
    let res: Result<u32, ()> = try {
        loop {
            err()?;
        }
    };
    println!("res: {:?}", res);
}

fn test_ok_wrapped_divergent_expr_2() {
    let _: Result<u32, ()> = try {
        return
    };
}

fn test_autogenerated_unit_after_divergent_expr() {
    let _: Result<(), ()> = try {
        return;
    };
}

// In the following cases unreachable code should be reported.

fn test_try_block_after_divergent_stmt() {
    let _: Result<u32, ()> = {
        return;

        try {
            loop {
                err()?;
            }
        }
        //~^^^^^ WARNING unreachable expression
    };
}

fn test_wrapped_divergent_expr() {
    let _: Result<u32, ()> = {
        Err(return)
        //~^ WARNING unreachable call
    };
}

fn test_expr_after_divergent_stmt_in_try_block() {
    let res: Result<u32, ()> = try {
        loop {
            err()?;
        }

        42
        //~^ WARNING unreachable expression
    };
    println!("res: {:?}", res);
}

fn main() {
    test_ok_wrapped_divergent_expr_1();
    test_ok_wrapped_divergent_expr_2();
    test_autogenerated_unit_after_divergent_expr();
    test_try_block_after_divergent_stmt();
    test_wrapped_divergent_expr();
    test_expr_after_divergent_stmt_in_try_block();
}
