// run-rustfix
#![allow(dead_code)]

fn unwrap_or() {
    // int case
    Some(1).unwrap_or(42);

    // int case reversed
    Some(1).unwrap_or(42);

    // richer none expr
    Some(1).unwrap_or(1 + 42);

    // multiline case
    #[rustfmt::skip]
    Some(1).unwrap_or({
        42 + 42
            + 42 + 42 + 42
            + 42 + 42 + 42
    });

    // string case
    Some("Bob").unwrap_or("Alice");

    // don't lint
    match Some(1) {
        Some(i) => i + 2,
        None => 42,
    };
    match Some(1) {
        Some(i) => i,
        None => return,
    };
    for j in 0..4 {
        match Some(j) {
            Some(i) => i,
            None => continue,
        };
        match Some(j) {
            Some(i) => i,
            None => break,
        };
    }

    // cases where the none arm isn't a constant expression
    // are not linted due to potential ownership issues

    // ownership issue example, don't lint
    struct NonCopyable;
    let mut option: Option<NonCopyable> = None;
    match option {
        Some(x) => x,
        None => {
            option = Some(NonCopyable);
            // some more code ...
            option.unwrap()
        },
    };

    // ownership issue example, don't lint
    let option: Option<&str> = None;
    match option {
        Some(s) => s,
        None => &format!("{} {}!", "hello", "world"),
    };
}

fn main() {}
