// Can't put mut in non-ident pattern

//@ edition:2018

#![feature(box_patterns)]
#![allow(warnings)]

pub fn main() {
    let mut _ = 0; //~ ERROR `mut` must be followed by a named binding
    let mut (_, _) = (0, 0); //~ ERROR `mut` must be followed by a named binding

    let mut (x @ y) = 0; //~ ERROR `mut` must be attached to each individual binding

    let mut mut x = 0;
    //~^ ERROR `mut` on a binding may not be repeated
    //~| remove the additional `mut`s

    struct Foo { x: isize }
    let mut Foo { x: x } = Foo { x: 3 };
    //~^ ERROR `mut` must be attached to each individual binding
    //~| add `mut` to each binding

    let mut Foo { x } = Foo { x: 3 };
    //~^ ERROR `mut` must be attached to each individual binding
    //~| add `mut` to each binding

    struct r#yield(u8, u8);
    let mut mut yield(become, await) = r#yield(0, 0);
    //~^ ERROR `mut` on a binding may not be repeated
    //~| ERROR `mut` must be followed by a named binding
    //~| ERROR expected identifier, found reserved keyword `yield`
    //~| ERROR expected identifier, found reserved keyword `become`
    //~| ERROR expected identifier, found keyword `await`

    struct W<T, U>(T, U);
    struct B { f: Box<u8> }
    let mut W(mut a, W(b, W(ref c, W(d, B { box f }))))
    //~^ ERROR `mut` must be attached to each individual binding
        = W(0, W(1, W(2, W(3, B { f: Box::new(4u8) }))));

    // Make sure we don't accidentally allow `mut $p` where `$p:pat`.
    macro_rules! foo {
        ($p:pat) => {
            let mut $p = 0; //~ ERROR expected identifier, found `x`
        }
    }
    foo!(x);
}
