//@ run-rustfix

#![deny(unused_parens)]
#![allow(while_true)] // for rustfix

#[derive(Eq, PartialEq)]
struct X { y: bool }
impl X {
    fn foo(&self, conjunct: bool) -> bool { self.y && conjunct }
}

fn foo() -> isize {
    return 1; //~ ERROR unnecessary parentheses around `return` value
}
fn bar(y: bool) -> X {
    return X { y }; //~ ERROR unnecessary parentheses around `return` value
}

pub fn unused_parens_around_return_type() -> u32 { //~ ERROR unnecessary parentheses around type
    panic!()
}

pub fn unused_parens_around_block_return() -> u32 {
    let _foo = {
        5 //~ ERROR unnecessary parentheses around block return value
    };
    5 //~ ERROR unnecessary parentheses around block return value
}

pub trait Trait {
    fn test(&self);
}

pub fn passes_unused_parens_lint() -> &'static (dyn Trait) {
    panic!()
}

pub fn parens_with_keyword(e: &[()]) -> i32 {
    if true {} //~ ERROR unnecessary parentheses around `if`
    while true {} //~ ERROR unnecessary parentheses around `while`
    for _ in e {} //~ ERROR unnecessary parentheses around `for`
    match 1 { _ => ()} //~ ERROR unnecessary parentheses around `match`
    return 1; //~ ERROR unnecessary parentheses around `return` value
}

macro_rules! baz {
    ($($foo:expr),+) => {
        ($($foo),*)
    };
}

macro_rules! unit {
    () => {
        ()
    };
}

struct One;

impl std::ops::Sub<One> for () {
    type Output = i32;
    fn sub(self, _: One) -> Self::Output {
        -1
    }
}

impl std::ops::Neg for One {
    type Output = i32;
    fn neg(self) -> Self::Output {
        -1
    }
}

pub const CONST_ITEM: usize = 10; //~ ERROR unnecessary parentheses around assigned value
pub static STATIC_ITEM: usize = 10; //~ ERROR unnecessary parentheses around assigned value

fn main() {
    foo();
    bar(true); //~ ERROR unnecessary parentheses around function argument

    if true {} //~ ERROR unnecessary parentheses around `if` condition
    while true {} //~ ERROR unnecessary parentheses around `while` condition
    match true { //~ ERROR unnecessary parentheses around `match` scrutinee expression
        _ => {}
    }
    if let 1 = 1 {} //~ ERROR unnecessary parentheses around `let` scrutinee expression
    while let 1 = 2 {} //~ ERROR unnecessary parentheses around `let` scrutinee expression
    let v = X { y: false };
    // struct lits needs parens, so these shouldn't warn.
    if (v == X { y: true }) {}
    if (X { y: true } == v) {}
    if (X { y: false }.y) {}
    // this shouldn't warn, because the parens are necessary to disambiguate let chains
    if let true = (true && false) {}

    while (X { y: false }.foo(true)) {}
    while (true | X { y: false }.y) {}

    match (X { y: false }) {
        _ => {}
    }

    X { y: false }.foo(true); //~ ERROR unnecessary parentheses around method argument

    let mut _a = 0; //~ ERROR unnecessary parentheses around assigned value
    _a = 0; //~ ERROR unnecessary parentheses around assigned value
    _a += 1; //~ ERROR unnecessary parentheses around assigned value

    let mut _a = 3; //~ ERROR unnecessary parentheses around pattern
    let mut _a = 3; //~ ERROR unnecessary parentheses around pattern
    let mut _a = 3; //~ ERROR unnecessary parentheses around pattern

    let _a = 3; //~ ERROR unnecessary parentheses around pattern
    let _a = 3; //~ ERROR unnecessary parentheses around pattern
    let _a = 3; //~ ERROR unnecessary parentheses around pattern

    let _a = baz!(3, 4);
    let _b = baz!(3);

    let _ = {
        unit!() - One //~ ERROR unnecessary parentheses around block return value
    } + {
        unit![] - One //~ ERROR unnecessary parentheses around block return value
    } + {
        // FIXME: false positive. This parenthesis is required.
        unit! {} - One //~ ERROR unnecessary parentheses around block return value
    };

    // Do *not* lint around `&raw` (but do lint when `&` creates a reference).
    let mut x = 0;
    let _r = &x; //~ ERROR unnecessary parentheses
    let _r = &mut x; //~ ERROR unnecessary parentheses
    let _r = (&raw const x);
    let _r = (&raw mut x);
}
