// build-pass (FIXME(62277): could be check-pass?)

#![warn(unused_must_use)]

#[derive(PartialEq, Eq)]
struct MyStruct {
    n: usize,
}

impl MyStruct {
    #[must_use]
    fn need_to_use_this_method_value(&self) -> usize {
        self.n
    }

    #[must_use]
    fn need_to_use_this_associated_function_value() -> isize {
        -1
    }
}

trait EvenNature {
    #[must_use = "no side effects"]
    fn is_even(&self) -> bool;
}

impl EvenNature for MyStruct {
    fn is_even(&self) -> bool {
        self.n % 2 == 0
    }
}

trait Replaceable {
    fn replace(&mut self, substitute: usize) -> usize;
}

impl Replaceable for MyStruct {
    // ↓ N.b.: `#[must_use]` attribute on a particular trait implementation
    // method won't work; the attribute should be on the method signature in
    // the trait's definition.
    #[must_use]
    fn replace(&mut self, substitute: usize) -> usize {
        let previously = self.n;
        self.n = substitute;
        previously
    }
}

#[must_use = "it's important"]
fn need_to_use_this_value() -> bool {
    false
}

fn main() {
    need_to_use_this_value(); //~ WARN unused return value

    let mut m = MyStruct { n: 2 };
    let n = MyStruct { n: 3 };

    m.need_to_use_this_method_value(); //~ WARN unused return value
    m.is_even(); // trait method!
    //~^ WARN unused return value

    MyStruct::need_to_use_this_associated_function_value();
    //~^ WARN unused return value

    m.replace(3); // won't warn (annotation needs to be in trait definition)

    // comparison methods are `must_use`
    2.eq(&3); //~ WARN unused return value
    m.eq(&n); //~ WARN unused return value

    // lint includes comparison operators
    2 == 3; //~ WARN unused comparison
    m == n; //~ WARN unused comparison
}
