// Here we test that `..` is allowed in all pattern locations *syntactically*.
// The semantic test is in `rest-pat-semantic-disallowed.rs`.

// check-pass

fn main() {}

macro_rules! accept_pat {
    ($p:pat) => {}
}

accept_pat!(..);

#[cfg(FALSE)]
fn rest_patterns() {
    // Top level:
    fn foo(..: u8) {}
    let ..;

    // Box patterns:
    let box ..;

    // In or-patterns:
    match x {
        .. | .. => {}
    }

    // Ref patterns:
    let &..;
    let &mut ..;

    // Ident patterns:
    let x @ ..;
    let ref x @ ..;
    let ref mut x @ ..;

    // Tuple:
    let (..); // This is interpreted as a tuple pattern, not a parenthesis one.
    let (..,); // Allowing trailing comma.
    let (.., .., ..); // Duplicates also.
    let (.., P, ..); // Including with things in between.

    // Tuple struct (same idea as for tuple patterns):
    let A(..);
    let A(..,);
    let A(.., .., ..);
    let A(.., P, ..);

    // Array/Slice (like with tuple patterns):
    let [..];
    let [..,];
    let [.., .., ..];
    let [.., P, ..];

    // Random walk to guard against special casing:
    match x {
        .. |
        [
            (
                box ..,
                &(..),
                &mut ..,
                x @ ..
            ),
            ref x @ ..,
        ] |
        ref mut x @ ..
        => {}
    }
}
