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

// compile-flags: --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();
}
