#![warn(clippy::unnecessary_literal_unwrap)]
#![allow(unreachable_code)]
#![allow(
    clippy::unnecessary_lazy_evaluations,
    clippy::diverging_sub_expression,
    clippy::let_unit_value,
    clippy::no_effect
)]

fn unwrap_option_some() {
    let _val = 1;
    let _val = 1;

    1;
    1;
}

#[rustfmt::skip] // force rustfmt not to remove braces in `|| { 234 }`
fn unwrap_option_none() {
    let _val = panic!();
    let _val = panic!("this always happens");
    let _val: String = String::default();
    let _val: u16 = 234;
    let _val: u16 = 234;
    let _val: u16 = { 234 };
    let _val: u16 = { 234 };

    panic!();
    panic!("this always happens");
    String::default();
    234;
    234;
    { 234 };
    { 234 };
}

fn unwrap_result_ok() {
    let _val = 1;
    let _val = 1;
    let _val = panic!("{:?}", 1);
    let _val = panic!("{1}: {:?}", 1, "this always happens");

    1;
    1;
    panic!("{:?}", 1);
    panic!("{1}: {:?}", 1, "this always happens");
}

fn unwrap_result_err() {
    let _val = 1;
    let _val = 1;
    let _val = panic!("{:?}", 1);
    let _val = panic!("{1}: {:?}", 1, "this always happens");

    1;
    1;
    panic!("{:?}", 1);
    panic!("{1}: {:?}", 1, "this always happens");
}

fn unwrap_methods_option() {
    let _val = 1;
    let _val = 1;
    let _val = 1;

    1;
    1;
    1;
}

fn unwrap_methods_result() {
    let _val = 1;
    let _val = 1;
    let _val = 1;

    1;
    1;
    1;
}

fn unwrap_from_binding() {
    macro_rules! from_macro {
        () => {
            Some("")
        };
    }
    let val = from_macro!();
    let _ = val.unwrap_or("");
}

fn unwrap_unchecked() {
    let _ = 1;
    let _ = unsafe { 1 + *(&1 as *const i32) }; // needs to keep the unsafe block
    let _ = 1 + 1;
    let _ = 1;
    let _ = unsafe { 1 + *(&1 as *const i32) };
    let _ = 1 + 1;
    let _ = 123;
}

fn main() {
    unwrap_option_some();
    unwrap_option_none();
    unwrap_result_ok();
    unwrap_result_err();
    unwrap_methods_option();
    unwrap_methods_result();
    unwrap_unchecked();
}