// gate-test-let_chains

// Here we test feature gating for ´let_chains`.
// See `disallowed-positions.rs` for the grammar
// defining the language for gated allowed positions.

#![allow(irrefutable_let_patterns)]

use std::ops::Range;

fn _if() {
    if let 0 = 1 {} // Stable!

    if true && let 0 = 1 {}
    //~^ ERROR `let` expressions in this position are unstable [E0658]

    if let 0 = 1 && true {}
    //~^ ERROR `let` expressions in this position are unstable [E0658]

    if let Range { start: _, end: _ } = (true..true) && false {}
    //~^ ERROR `let` expressions in this position are unstable [E0658]

    if let 1 = 1 && let true = { true } && false {
    //~^ ERROR `let` expressions in this position are unstable [E0658]
    //~| ERROR `let` expressions in this position are unstable [E0658]
    }
}

fn _while() {
    while let 0 = 1 {} // Stable!

    while true && let 0 = 1 {}
    //~^ ERROR `let` expressions in this position are unstable [E0658]

    while let 0 = 1 && true {}
    //~^ ERROR `let` expressions in this position are unstable [E0658]

    while let Range { start: _, end: _ } = (true..true) && false {}
    //~^ ERROR `let` expressions in this position are unstable [E0658]
}

fn _macros() {
    macro_rules! noop_expr { ($e:expr) => {}; }

    noop_expr!((let 0 = 1));
    //~^ ERROR expected expression, found `let` statement

    macro_rules! use_expr {
        ($e:expr) => {
            if $e {}
            while $e {}
        }
    }
    #[cfg(FALSE)] (let 0 = 1);
    //~^ ERROR expected expression, found `let` statement
    use_expr!(let 0 = 1);
    //~^ ERROR no rules expected the token `let`
}

fn main() {}
