#![feature(box_patterns)]
#![warn(clippy::unnested_or_patterns)]
#![allow(
    clippy::cognitive_complexity,
    clippy::match_ref_pats,
    clippy::upper_case_acronyms,
    clippy::needless_if,
    clippy::manual_range_patterns
)]
#![allow(unreachable_patterns, irrefutable_let_patterns, unused)]

fn main() {
    // Should be ignored by this lint, as nesting requires more characters.
    if let &0 | &2 = &0 {}

    if let box (0 | 2) = Box::new(0) {}
    //~^ unnested_or_patterns
    if let box (0 | 1 | 2 | 3 | 4) = Box::new(0) {}
    //~^ unnested_or_patterns
    const C0: Option<u8> = Some(1);
    if let Some(1 | 2) | C0 = None {}
    //~^ unnested_or_patterns
    if let &mut (0 | 2) = &mut 0 {}
    //~^ unnested_or_patterns
    if let x @ (0 | 2) = 0 {}
    //~^ unnested_or_patterns
    if let (0, 1 | 2 | 3) = (0, 0) {}
    //~^ unnested_or_patterns
    if let (1 | 2 | 3, 0) = (0, 0) {}
    //~^ unnested_or_patterns
    if let (x, ..) | (x, 1 | 2) = (0, 1) {}
    //~^ unnested_or_patterns
    if let [0 | 1] = [0] {}
    //~^ unnested_or_patterns
    if let [x, 0 | 1] = [0, 1] {}
    //~^ unnested_or_patterns
    if let [x, 0 | 1 | 2] = [0, 1] {}
    //~^ unnested_or_patterns
    if let [x, ..] | [x, 1 | 2] = [0, 1] {}
    //~^ unnested_or_patterns
    struct TS(u8, u8);
    if let TS(0 | 1, x) = TS(0, 0) {}
    //~^ unnested_or_patterns
    if let TS(1 | 2 | 3, 0) = TS(0, 0) {}
    //~^ unnested_or_patterns
    if let TS(x, ..) | TS(x, 1 | 2) = TS(0, 0) {}
    //~^ unnested_or_patterns
    struct S {
        x: u8,
        y: u8,
    }
    if let S { x: 0 | 1, y } = (S { x: 0, y: 1 }) {}
    //~^ unnested_or_patterns
    if let S { x: 0, y, .. } | S { y, x: 1 } = (S { x: 0, y: 1 }) {}
}

#[clippy::msrv = "1.52"]
fn msrv_1_52() {
    if let [1] | [52] = [0] {}
}

#[clippy::msrv = "1.53"]
fn msrv_1_53() {
    if let [1 | 53] = [0] {}
    //~^ unnested_or_patterns
}

mod issue9952 {
    fn or_in_local() {
        let (0 | 1 | _) = 0;
        //~^ unnested_or_patterns

        if let (0 | 1 | _) = 0 {}
        //~^ unnested_or_patterns
    }

    fn or_in_param((x | x | x): i32) {}
    //~^ unnested_or_patterns
}
