mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 21:16:44 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			77 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //@ 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
 | |
| }
 | 
