DROP_BOUNDS in rustc_lint::traits - Rust
Description: The `drop_bounds` lint checks for generics with `std::ops::Drop` as bounds.

Skip to main content

## DROP_BOUNDS

# Static DROP_BOUNDS

Source

    pub static DROP_BOUNDS: &Lint

Expand description

The `drop_bounds` lint checks for generics with `std::ops::Drop` as bounds.

#### §Example

    fn foo<T: Drop>() {}

{{produces}}

#### §Explanation

A generic trait bound of the form `T: Drop` is most likely misleading and not what the programmer intended (they probably should have used `std::mem::needs_drop` instead).

`Drop` bounds do not actually indicate whether a type can be trivially dropped or not, because a composite type containing `Drop` types does not necessarily implement `Drop` itself. Naïvely, one might be tempted to write an implementation that assumes that a type can be trivially dropped while also supplying a specialization for `T: Drop` that actually calls the destructor. However, this breaks down e.g. when `T` is `String`, which does not implement `Drop` itself but contains a `Vec`, which does implement `Drop`, so assuming `T` can be trivially dropped would lead to a memory leak here.

Furthermore, the `Drop` trait only contains one method, `Drop::drop`, which may not be called explicitly in user code (`E0040`), so there is really no use case for using `Drop` in trait bounds, save perhaps for some obscure corner cases, which can use `#[allow(drop_bounds)]`.