LET_UNDERSCORE_DROP in rustc_lint::let_underscore - Rust
Description: The `let_underscore_drop` lint checks for statements which don’t bind an expression which has a non-trivial Drop implementation to anything, causing the expression to be dropped immediately instead of at end of scope.

Skip to main content

## LET_UNDERSCORE_DROP

# Static LET_UNDERSCORE_DROP

Source

    pub static LET_UNDERSCORE_DROP: &Lint

Expand description

The `let_underscore_drop` lint checks for statements which don’t bind an expression which has a non-trivial Drop implementation to anything, causing the expression to be dropped immediately instead of at end of scope.

#### §Example

    struct SomeStruct;
    impl Drop for SomeStruct {
        fn drop(&mut self) {
            println!("Dropping SomeStruct");
        }
    }

    fn main() {
       #[warn(let_underscore_drop)]
        // SomeStruct is dropped immediately instead of at end of scope,
        // so "Dropping SomeStruct" is printed before "end of main".
        // The order of prints would be reversed if SomeStruct was bound to
        // a name (such as "_foo").
        let _ = SomeStruct;
        println!("end of main");
    }

{{produces}}

#### §Explanation

Statements which assign an expression to an underscore causes the expression to immediately drop instead of extending the expression’s lifetime to the end of the scope. This is usually unintended, especially for types like `MutexGuard`, which are typically used to lock a mutex for the duration of an entire scope.

If you want to extend the expression’s lifetime to the end of the scope, assign an underscore-prefixed name (such as `_foo`) to the expression. If you do actually want to drop the expression immediately, then calling `std::mem::drop` on the expression is clearer and helps convey intent.