#![warn(clippy::match_single_binding)]
#![allow(
    unused,
    clippy::let_unit_value,
    clippy::no_effect,
    clippy::toplevel_ref_arg,
    clippy::useless_vec
)]

struct Point {
    x: i32,
    y: i32,
}

fn coords() -> Point {
    Point { x: 1, y: 2 }
}

macro_rules! foo {
    ($param:expr) => {
        match $param {
            _ => println!("whatever"),
        }
    };
}

fn main() {
    let a = 1;
    let b = 2;
    let c = 3;
    // Lint
    let (x, y, z) = (a, b, c);
    {
        println!("{x} {y} {z}");
    }
    // Lint
    let (x, y, z) = (a, b, c);
    println!("{x} {y} {z}");
    // Ok
    foo!(a);
    // Ok
    match a {
        2 => println!("2"),
        _ => println!("Not 2"),
    }
    // Ok
    let d = Some(5);
    match d {
        Some(d) => println!("{d}"),
        _ => println!("None"),
    }
    // Lint
    println!("whatever");
    // Lint
    {
        let x = 29;
        println!("x has a value of {x}");
    }
    // Lint
    {
        let e = 5 * a;
        if e >= 5 {
            println!("e is superior to 5");
        }
    }
    // Lint
    let p = Point { x: 0, y: 7 };
    let Point { x, y } = p;
    println!("Coords: ({x}, {y})");
    // Lint
    let Point { x: x1, y: y1 } = p;
    println!("Coords: ({x1}, {y1})");
    // Lint
    let x = 5;
    let ref r = x;
    println!("Got a reference to {r}");
    // Lint
    let mut x = 5;
    let ref mut mr = x;
    println!("Got a mutable reference to {mr}");
    // Lint
    let Point { x, y } = coords();
    let product = x * y;
    // Lint
    let v = vec![Some(1), Some(2), Some(3), Some(4)];
    #[allow(clippy::let_and_return)]
    let _ = v
        .iter()
        .map(|i| {
            let unwrapped = i.unwrap();
            unwrapped
        })
        .collect::<Vec<u8>>();
    // Ok
    let x = 1;
    match x {
        #[cfg(disabled_feature)]
        0 => println!("Disabled branch"),
        _ => println!("Enabled branch"),
    }

    // Ok
    let x = 1;
    let y = 1;
    match match y {
        0 => 1,
        _ => 2,
    } {
        #[cfg(disabled_feature)]
        0 => println!("Array index start"),
        _ => println!("Not an array index start"),
    }

    // Lint
    let x = 1;
    println!("Not an array index start")
}

fn issue_8723() {
    let (mut val, idx) = ("a b", 1);

    let (pre, suf) = val.split_at(idx);
    val = {
        println!("{pre}");
        suf
    };

    let _ = val;
}

fn side_effects() {}

fn issue_9575() {
    let _ = || {
        side_effects();
        println!("Needs curlies")
    };
}

fn issue_9725(r: Option<u32>) {
    let x = r;
    match x {
        Some(_) => {
            println!("Some");
        },
        None => {
            println!("None");
        },
    };
}

fn issue_10447() -> usize {
    ();

    let a = ();

    side_effects();

    let b = side_effects();

    println!("1");

    let c = println!("1");

    let in_expr = [
        (),
        side_effects(),
        println!("1"),
    ];

    2
}

fn issue14634() {
    macro_rules! id {
        ($i:ident) => {
            $i
        };
    }
    dbg!(3);
    println!("here");
    //~^^^ match_single_binding
    let id!(a) = dbg!(3);
    println!("found {a}");
    //~^^^ match_single_binding
    let id!(b) = dbg!(3);
    let id!(_a) = dbg!(b + 1);
    //~^^^ match_single_binding
}

mod issue14991 {
    struct AnnoConstWOBlock {
        inner: [(); {
            let _n = 1;
            42
        }],
    }

    struct AnnoConstWBlock {
        inner: [(); {
            let _n = 1;
            42
        }],
    }
}

mod issue15018 {
    fn used_later(a: i32, b: i32, c: i32) {
        let x = 1;
        {
            let (x, y, z) = (a, b, c);
            println!("{x} {y} {z}");
        }
        println!("x = {x}");
    }

    fn not_used_later(a: i32, b: i32, c: i32) {
        let (x, y, z) = (a, b, c);
        println!("{x} {y} {z}")
    }

    #[allow(irrefutable_let_patterns)]
    fn not_used_later_but_shadowed(a: i32, b: i32, c: i32) {
        let (x, y, z) = (a, b, c);
        println!("{x} {y} {z}");
        let x = 1;
        println!("x = {x}");
    }

    #[allow(irrefutable_let_patterns)]
    fn not_used_later_but_shadowed_nested(a: i32, b: i32, c: i32) {
        let (x, y, z) = (a, b, c);
        println!("{x} {x} {y}");
        if let (x, y, z) = (a, b, c) {
            println!("{x} {y} {z}")
        }

        {
            let x: i32 = 1;
            {
                let (x, y, z) = (a, b, c);
                println!("{x} {y} {z}");
            }
            if let (x, y, z) = (a, x, c) {
                println!("{x} {y} {z}")
            }
        }

        {
            let (x, y, z) = (a, b, c);
            println!("{x} {y} {z}");
            let fn_ = |y| {
                println!("{a} {b} {y}");
            };
            fn_(c);
        }
    }
}

#[allow(clippy::short_circuit_statement)]
fn issue15269(a: usize, b: usize, c: usize) -> bool {
    a < b
        && b < c;

    a < b
        && b < c
}

#[allow(
    irrefutable_let_patterns,
    clippy::blocks_in_conditions,
    clippy::unused_unit,
    clippy::let_unit_value,
    clippy::unit_arg,
    clippy::unnecessary_operation
)]
fn issue15537(a: i32) -> ((), (), ()) {
    let y = (
        { todo!() },
        {
            { a };
            ()
        },
        (),
    );

    let y = [
        { todo!() },
        {
            { a };
            ()
        },
        (),
    ];

    fn call(x: (), y: (), z: ()) {}
    let y = call(
        { todo!() },
        {
            { a };
            ()
        },
        (),
    );

    struct Foo;
    impl Foo {
        fn method(&self, x: (), y: (), z: ()) {}
    }
    let x = Foo;
    x.method(
        { todo!() },
        {
            { a };
            ()
        },
        (),
    );

    -{
        { a };
        1
    };

    _ = { a };
    1;

    if let x = {
        { a };
        1
    } {}

    if {
        { a };
        true
    } {
        todo!()
    }

    [1, 2, 3][{
        { a };
        1usize
    }];

    todo!()
}
