#![feature(if_let_guard)]
#![feature(let_chains)]
#![allow(irrefutable_let_patterns)]

fn same_pattern(c: bool) {
    let x: Box<_> = Box::new(1);

    let v = (1, 2);

    match v {
        (1, 2) if let y = x && c => (),
        (1, 2) if let z = x => (), //~ ERROR use of moved value: `x`
        _ => (),
    }
}

fn same_pattern_ok(c: bool) {
    let x: Box<_> = Box::new(1);

    let v = (1, 2);

    match v {
        (1, 2) if c && let y = x => (),
        (1, 2) if let z = x => (),
        _ => (),
    }
}

fn different_patterns(c: bool) {
    let x: Box<_> = Box::new(1);

    let v = (1, 2);

    match v {
        (1, _) if let y = x && c => (),
        (_, 2) if let z = x => (), //~ ERROR use of moved value: `x`
        _ => (),
    }
}

fn different_patterns_ok(c: bool) {
    let x: Box<_> = Box::new(1);

    let v = (1, 2);

    match v {
        (1, _) if c && let y = x => (),
        (_, 2) if let z = x => (),
        _ => (),
    }
}

fn or_pattern(c: bool) {
    let x: Box<_> = Box::new(1);

    let v = (1, 2);

    match v {
        (1, _) | (_, 2) if let y = x && c => (), //~ ERROR use of moved value: `x`
        _ => (),
    }
}

fn or_pattern_ok(c: bool) {
    let x: Box<_> = Box::new(1);

    let v = (1, 2);

    match v {
        (1, _) | (_, 2) if c && let y = x => (),
        _ => (),
    }
}

fn use_in_arm(c: bool) {
    let x: Box<_> = Box::new(1);

    let v = (1, 2);

    match v {
        (1, 2) if let y = x && c => false,
        _ => { *x == 1 }, //~ ERROR use of moved value: `x`
    };
}

fn use_in_arm_ok(c: bool) {
    let x: Box<_> = Box::new(1);

    let v = (1, 2);

    match v {
        (1, 2) if c && let y = x => false,
        _ => { *x == 1 },
    };
}

fn main() {}
