Clippy lints / Pedantic
Clippy lint · Pedantic · checked with Clippy 0.1.99
clippy::return_self_not_must_use: missing `#[must_use]` attribute on a method returning `Self`
What it meansThis lint warns when a method returning Self doesn’t have the #[must_use] attribute. It is in the pedantic group and off by default.
What you see
warning: missing `#[must_use]` attribute on a method returning `Self` --> main.rs:4:5 | 4 | / pub fn bar(&self) -> Self { 5 | | Self 6 | | } | |_____^ | = help: consider adding the `#[must_use]` attribute to the method or directly to the `Self` type = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#return_self_not_must_use = note: `-W clippy::return-self-not-must-use` implied by `-W clippy::pedantic`
Real output of Clippy 0.1.99 (Rust 1.99) on the example below. Names and line numbers in yours will differ.
Does it matter?
Methods returning Self often create new values, having the #[must_use] attribute prevents users from “forgetting” to use the newly created value. The #[must_use] attribute can be added to the type itself to ensure that instances are never forgotten. Functions returning a type marked with #[must_use] will not be linted, as the usage is already enforced by the type attribute.
Stricter lints with some false positives. Off by default; opt in with clippy::pedantic.
How to fix it
Clippy does not fix this one automatically. Change the code by hand:
Flagged
pub struct Bar;
impl Bar {
// Missing attribute
pub fn bar(&self) -> Self {
Self
}
}
Write this instead
// It's better to have the `#[must_use]` attribute on the method like this:
pub struct Bar;
impl Bar {
#[must_use]
pub fn bar(&self) -> Self {
Self
}
}
// Or on the type definition like this:
#[must_use]
pub struct Bar;
impl Bar {
pub fn bar(&self) -> Self {
Self
}
}
Turn it off, or on
It is off by default. To use it, set it to warn or deny:
Whole crate (Cargo.toml)
[lints.clippy]
return_self_not_must_use = "warn"In code
#![warn(clippy::return_self_not_must_use)]One run
cargo clippy -- -W clippy::return-self-not-must-useThe [lints] table needs Rust 1.74 or newer. In a workspace, put it under [workspace.lints.clippy] and add [lints] workspace = true to each member.
Clippy's own documentation
What it does
This lint warns when a method returning Self doesn’t have the #[must_use] attribute.
Why is this bad?
Methods returning Self often create new values, having the #[must_use] attribute
prevents users from “forgetting” to use the newly created value.
The #[must_use] attribute can be added to the type itself to ensure that instances
are never forgotten. Functions returning a type marked with #[must_use] will not be
linted, as the usage is already enforced by the type attribute.
Limitations
This lint is only applied on methods taking a self argument. It would be mostly noise
if it was added on constructors for example.
Example
pub struct Bar;
impl Bar {
// Missing attribute
pub fn bar(&self) -> Self {
Self
}
}
Use instead:
// It's better to have the `#[must_use]` attribute on the method like this:
pub struct Bar;
impl Bar {
#[must_use]
pub fn bar(&self) -> Self {
Self
}
}
// Or on the type definition like this:
#[must_use]
pub struct Bar;
impl Bar {
pub fn bar(&self) -> Self {
Self
}
}
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- too_many_linesChecks for functions with a large amount of lines
- missing_errors_docChecks the doc comments of publicly visible functions that return a Result type and warns if there is no # Errors section
- must_use_candidateChecks for public functions that have no #[must_use] attribute, but return something not already marked must-use, have no mutable arg and mutate no statics
- ref_binding_to_referenceChecks for ref bindings which create a reference to a reference
- ref_optionWarns when a function signature uses &Option<T> instead of Option<&T>
- ref_option_refsince `&` implements the `Copy` trait, `&Option<&T>` can be simplified to `Option<&T>`
- same_functions_in_if_conditionChecks for consecutive ifs with the same function call
- same_length_and_capacityChecks for usages of Vec::from_raw_parts and String::from_raw_parts where the same expression is used for the length and the capacity
- self_only_used_in_recursion`self` is only used in recursion
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::too_many_linesChecks for functions with a large amount of linesRead it next →Did this answer your question?