Static rustc_lint::traits::DROP_BOUNDS
source · pub static DROP_BOUNDS: &LintExpand 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)].