Auto merge of #6181 - cgm616:undropped-manually-drops, r=flip1995
Add new lint for undropped ManuallyDrop values
Adds a new lint for the following code:
```rust
struct S;
impl Drop for S {
fn drop(&mut self) {
println!("drip drop");
}
}
fn main() {
// This will not drop the `S`!!!
drop(std::mem::ManuallyDrop::new(S));
unsafe {
// This will.
std::mem::ManuallyDrop::drop(&mut std::mem::ManuallyDrop::new(S));
}
}
```
The inner value of a `ManuallyDrop` will not be dropped unless the proper, unsafe drop function is called on it. This lint makes sure that a user does not accidently use the wrong function and forget to drop a `ManuallyDrop` value.
Fixes #5581.
---
*Please keep the line below*
changelog: none
This commit is contained in:
commit
6b01c39e64
6 changed files with 108 additions and 0 deletions
26
tests/ui/undropped_manually_drops.rs
Normal file
26
tests/ui/undropped_manually_drops.rs
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
#![warn(clippy::undropped_manually_drops)]
|
||||
|
||||
struct S;
|
||||
|
||||
fn main() {
|
||||
let f = std::mem::drop;
|
||||
let g = std::mem::ManuallyDrop::drop;
|
||||
let mut manual1 = std::mem::ManuallyDrop::new(S);
|
||||
let mut manual2 = std::mem::ManuallyDrop::new(S);
|
||||
let mut manual3 = std::mem::ManuallyDrop::new(S);
|
||||
let mut manual4 = std::mem::ManuallyDrop::new(S);
|
||||
|
||||
// These lines will not drop `S` and should be linted
|
||||
drop(std::mem::ManuallyDrop::new(S));
|
||||
drop(manual1);
|
||||
|
||||
// FIXME: this line is not linted, though it should be
|
||||
f(manual2);
|
||||
|
||||
// These lines will drop `S` and should be okay.
|
||||
unsafe {
|
||||
std::mem::ManuallyDrop::drop(&mut std::mem::ManuallyDrop::new(S));
|
||||
std::mem::ManuallyDrop::drop(&mut manual3);
|
||||
g(&mut manual4);
|
||||
}
|
||||
}
|
||||
19
tests/ui/undropped_manually_drops.stderr
Normal file
19
tests/ui/undropped_manually_drops.stderr
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
error: the inner value of this ManuallyDrop will not be dropped
|
||||
--> $DIR/undropped_manually_drops.rs:14:5
|
||||
|
|
||||
LL | drop(std::mem::ManuallyDrop::new(S));
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `-D clippy::undropped-manually-drops` implied by `-D warnings`
|
||||
= help: to drop a `ManuallyDrop<T>`, use std::mem::ManuallyDrop::drop
|
||||
|
||||
error: the inner value of this ManuallyDrop will not be dropped
|
||||
--> $DIR/undropped_manually_drops.rs:15:5
|
||||
|
|
||||
LL | drop(manual1);
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= help: to drop a `ManuallyDrop<T>`, use std::mem::ManuallyDrop::drop
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue