2017-09-15 16:26:34 -07:00
|
|
|
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
|
|
|
// file at the top-level directory of this distribution and at
|
|
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
// option. This file may not be copied, modified, or distributed
|
|
|
|
// except according to those terms.
|
|
|
|
|
2018-04-02 13:20:06 +02:00
|
|
|
// compile-pass
|
2017-12-10 19:14:01 +00:00
|
|
|
|
2017-09-15 16:26:34 -07:00
|
|
|
#![warn(unused_must_use)]
|
|
|
|
|
2017-09-23 10:11:39 -07:00
|
|
|
#[derive(PartialEq, Eq)]
|
2017-09-15 16:26:34 -07:00
|
|
|
struct MyStruct {
|
|
|
|
n: usize,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl MyStruct {
|
|
|
|
#[must_use]
|
|
|
|
fn need_to_use_this_method_value(&self) -> usize {
|
|
|
|
self.n
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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() {
|
2017-11-20 13:13:27 +01:00
|
|
|
need_to_use_this_value(); //~ WARN unused return value
|
2017-09-15 16:26:34 -07:00
|
|
|
|
|
|
|
let mut m = MyStruct { n: 2 };
|
2017-09-23 10:11:39 -07:00
|
|
|
let n = MyStruct { n: 3 };
|
|
|
|
|
2017-11-20 13:13:27 +01:00
|
|
|
m.need_to_use_this_method_value(); //~ WARN unused return value
|
2017-09-15 16:26:34 -07:00
|
|
|
m.is_even(); // trait method!
|
2017-11-20 13:13:27 +01:00
|
|
|
//~^ WARN unused return value
|
2017-09-15 16:26:34 -07:00
|
|
|
|
2017-09-22 15:45:47 -07:00
|
|
|
m.replace(3); // won't warn (annotation needs to be in trait definition)
|
2017-09-15 16:26:34 -07:00
|
|
|
|
2017-09-23 10:11:39 -07:00
|
|
|
// comparison methods are `must_use`
|
2017-11-20 13:13:27 +01:00
|
|
|
2.eq(&3); //~ WARN unused return value
|
|
|
|
m.eq(&n); //~ WARN unused return value
|
2017-09-15 16:26:34 -07:00
|
|
|
|
2017-09-23 10:11:39 -07:00
|
|
|
// lint includes comparison operators
|
2017-11-20 13:13:27 +01:00
|
|
|
2 == 3; //~ WARN unused comparison
|
|
|
|
m == n; //~ WARN unused comparison
|
2017-09-15 16:26:34 -07:00
|
|
|
}
|