Skip to content

Commit

Permalink
Auto merge of #56677 - aelred:must-use-on-traits, r=<try>
Browse files Browse the repository at this point in the history
#[must_use] on traits in stdlib

Based on #55506.

Adds `#[must_use]` attribute to traits in the stdlib:
- `Iterator`
- `Future`
- `FnOnce`
- `Fn`
- `FnMut`

There may be other traits that should have the attribute, but I couldn't find/think of any.
  • Loading branch information
bors committed Dec 10, 2018
2 parents 3a75e80 + 3246f49 commit aa9aa79
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/libcore/future/future.rs
Expand Up @@ -33,6 +33,7 @@ use task::{Poll, LocalWaker};
///
/// When using a future, you generally won't call `poll` directly, but instead
/// `await!` the value.
#[must_use]
pub trait Future {
/// The result of the `Future`.
type Output;
Expand Down
1 change: 1 addition & 0 deletions src/libcore/iter/iterator.rs
Expand Up @@ -98,6 +98,7 @@ fn _assert_is_object_safe(_: &dyn Iterator<Item=()>) {}
message="`{Self}` is not an iterator"
)]
#[doc(spotlight)]
#[must_use]
pub trait Iterator {
/// The type of the elements being iterated over.
#[stable(feature = "rust1", since = "1.0.0")]
Expand Down
3 changes: 3 additions & 0 deletions src/libcore/ops/function.rs
Expand Up @@ -72,6 +72,7 @@
label="expected an `Fn<{Args}>` closure, found `{Self}`",
)]
#[fundamental] // so that regex can rely that `&str: !FnMut`
#[must_use]
pub trait Fn<Args> : FnMut<Args> {
/// Performs the call operation.
#[unstable(feature = "fn_traits", issue = "29625")]
Expand Down Expand Up @@ -150,6 +151,7 @@ pub trait Fn<Args> : FnMut<Args> {
label="expected an `FnMut<{Args}>` closure, found `{Self}`",
)]
#[fundamental] // so that regex can rely that `&str: !FnMut`
#[must_use]
pub trait FnMut<Args> : FnOnce<Args> {
/// Performs the call operation.
#[unstable(feature = "fn_traits", issue = "29625")]
Expand Down Expand Up @@ -228,6 +230,7 @@ pub trait FnMut<Args> : FnOnce<Args> {
label="expected an `FnOnce<{Args}>` closure, found `{Self}`",
)]
#[fundamental] // so that regex can rely that `&str: !FnMut`
#[must_use]
pub trait FnOnce<Args> {
/// The returned type after the call operator is used.
#[stable(feature = "fn_once_output", since = "1.12.0")]
Expand Down
47 changes: 47 additions & 0 deletions src/test/compile-fail/must_use-in-stdlib-traits.rs
@@ -0,0 +1,47 @@
#![deny(unused_must_use)]
#![feature(futures_api, pin, arbitrary_self_types)]

use std::iter::Iterator;
use std::future::Future;

use std::task::{Poll, LocalWaker};
use std::pin::Pin;
use std::unimplemented;

struct MyFuture;

impl Future for MyFuture {
type Output = u32;

fn poll(self: Pin<&mut Self>, lw: &LocalWaker) -> Poll<u32> {
Poll::Pending
}
}

fn iterator() -> impl Iterator {
std::iter::empty::<u32>()
}

fn future() -> impl Future {
MyFuture
}

fn square_fn_once() -> impl FnOnce(u32) -> u32 {
|x| x * x
}

fn square_fn_mut() -> impl FnMut(u32) -> u32 {
|x| x * x
}

fn square_fn() -> impl Fn(u32) -> u32 {
|x| x * x
}

fn main() {
iterator(); //~ ERROR unused implementer of `std::iter::Iterator` that must be used
future(); //~ ERROR unused implementer of `std::future::Future` that must be used
square_fn_once(); //~ ERROR unused implementer of `std::ops::FnOnce` that must be used
square_fn_mut(); //~ ERROR unused implementer of `std::ops::FnMut` that must be used
square_fn(); //~ ERROR unused implementer of `std::ops::Fn` that must be used
}

0 comments on commit aa9aa79

Please sign in to comment.