//@ run-pass
#![allow(unused_variables)]
fn some_or_wildcard(r: &Option<i32>, b: &i32) {
    let _: &i32 = match r {
        Some(a) => a,
        _ => b,
    };
}

fn none_or_wildcard(r: &Option<i32>, b: &i32) {
    let _: &i32 = match r {
        None => b,
        _ => b,
    };
}

fn some_or_ref_none(r: &Option<i32>, b: &i32) {
    let _: &i32 = match r {
        Some(a) => a,
        &None => b,
    };
}

fn ref_some_or_none(r: &Option<i32>, b: &i32) {
    let _: &i32 = match r {
        &Some(ref a) => a,
        None => b,
    };
}

fn some_or_self(r: &Option<i32>) {
    let _: &Option<i32> = match r {
        Some(n) => {
            let _: &i32 = n;
            r
        },
        x => x,
    };
}

fn multiple_deref(r: &&&&&Option<i32>) {
    let _: i32 = match r {
        Some(a) => *a,
        None => 5,
    };
}

fn match_with_or() {
    // FIXME(tschottdorf): #44912.
    //
    // let x = &Some((3, 3));
    // let _: &i32 = match x {
    //     Some((x, 3)) | &Some((ref x, 5)) => x,
    //     _ => &5i32,
    // };
}

fn nested_mixed() {
    match (&Some(5), &Some(6)) {
        (Some(a), &Some(mut b)) => {
            //~^ WARN value assigned to `b` is never read
            // Here, the `a` will be `&i32`, because in the first half of the tuple
            // we hit a non-reference pattern and shift into `ref` mode.
            //
            // In the second half of the tuple there's no non-reference pattern,
            // so `b` will be `i32` (bound with `move` mode). Moreover, `b` is
            // mutable.
            let _: &i32 = a;
            b = 7;
            let _: i32 = b;
        },
        _ => {},
    };
}

fn nested_mixed_multiple_deref_1() {
    let x = (1, &Some(5));
    let y = &Some(x);
    match y {
        Some((a, Some(b))) => {
            let _: &i32 = a;
            let _: &i32 = b;
        },
        _ => {},
    };
}

fn nested_mixed_multiple_deref_2() {
    let x = &Some(5);
    let y = &x;
    match y {
        Some(z) => {
            let _: &i32 = z;
        },
        _ => {},
    }
}

fn new_mutable_reference() {
    let mut x = &mut Some(5);
    match &mut x {
        Some(y) => {
            *y = 5;
        },
        None => { },
    }

    match &mut x {
        Some(y) => {
            println!("{}", *y);
        },
        None => {},
    }
}

fn let_implicit_ref_binding() {
    struct Foo(i32);

    // Note that these rules apply to any pattern matching
    // whether it be in a `match` or a `let`.
    // For example, `x` here is a `ref` binding:
    let Foo(x) = &Foo(3);
    let _: &i32 = x;
}

fn explicit_mut_binding() {
    match &Some(5i32) {
        Some(mut n) => {
            n += 1;
            let _ = n;
        }
        None => {},
    };

    match &mut Some(5i32) {
        Some(n) => {
            *n += 1;
            let _ = n;
        }
        None => {},
    };

    match &mut &mut Some(5i32) {
        Some(n) => {
             let _: &mut i32 = n;
        }
        None => {},
    };
}

fn tuple_mut_and_mut_mut() {
    match (Some(5i32), &Some(5i32)) {
        (Some(n), Some(m)) => {
            // `n` and `m` are bound as immutable references. Make new references from them to
            // assert that.
            let r = n;
            let _ = r;
            let q = m;
            let _ = q;

            // Assert the types. Note that we use `n` and `m` here which would fail had they been
            // moved due to the assignments above.
            let _: i32 = n;
            let _: &i32 = m;
        }
        (_, _) => {},
    };

    match (&Some(5i32), &&Some(5i32)) {
        (Some(n), Some(m)) => {
            let _: &i32 = n;
            let _: &i32 = m;
        }
        (_, _) => {},
    };

    match &mut &mut (Some(5i32), Some(5i32)) {
        (Some(n), Some(m)) => {
            // Dereferenced through &mut &mut, so a mutable binding results.
            let _: &mut i32 = n;
            let _: &mut i32 = m;
        }
        (_, _) => {},
    };

    match (&mut Some(5i32), &mut &mut Some(5i32)) {
        (Some(n), Some(m)) => {
            let _: &mut i32 = n;
            let _: &mut i32 = m;
        }
        (_, _) => {},
    };
}

fn min_mir_embedded_type() {
    // The reduced invocation that an ICE was diagnosed with (was consuming
    // adjustments in wrong order).
    match (0u8, &&Some(5i32)) {
        (_, Some(m)) => {
            let _: &i32 = m;
        }
        (_, _) => {},
    };
}

fn no_autoderef() {
    // Binding.
    let x = &3;
    println!("{}", *x);

    // Wildcard.
    let _ = &3;

    // Constant of generic type (string)
    const Y: &'static str = "foo";
    assert_eq!(0, match "foo" {
        Y => 0,
        _ => 1,
    });

    // Reference pattern.
    let &x = &3;
}

pub fn main() {
    let r: &Option<i32> = &Some(3);
    let b = &4i32;

    none_or_wildcard(r, b);
    some_or_wildcard(r, b);
    some_or_ref_none(r, b);
    ref_some_or_none(r, b);

    some_or_self(r);
    multiple_deref(&&&&r);
    match_with_or();

    nested_mixed();
    nested_mixed_multiple_deref_1();
    nested_mixed_multiple_deref_2();

    new_mutable_reference();
    explicit_mut_binding();
    tuple_mut_and_mut_mut();
    min_mir_embedded_type();

    let_implicit_ref_binding();

    no_autoderef();
}
