Update tests and add known problems to docs
This commit is contained in:
parent
4a4f998c39
commit
e70817e712
@ -1524,6 +1524,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
|
|||||||
LintId::of(&types::UNIT_CMP),
|
LintId::of(&types::UNIT_CMP),
|
||||||
LintId::of(&types::UNNECESSARY_CAST),
|
LintId::of(&types::UNNECESSARY_CAST),
|
||||||
LintId::of(&types::VEC_BOX),
|
LintId::of(&types::VEC_BOX),
|
||||||
|
LintId::of(&undropped_manually_drops::UNDROPPED_MANUALLY_DROPS),
|
||||||
LintId::of(&unicode::INVISIBLE_CHARACTERS),
|
LintId::of(&unicode::INVISIBLE_CHARACTERS),
|
||||||
LintId::of(&unit_return_expecting_ord::UNIT_RETURN_EXPECTING_ORD),
|
LintId::of(&unit_return_expecting_ord::UNIT_RETURN_EXPECTING_ORD),
|
||||||
LintId::of(&unnamed_address::FN_ADDRESS_COMPARISONS),
|
LintId::of(&unnamed_address::FN_ADDRESS_COMPARISONS),
|
||||||
|
@ -1,14 +1,15 @@
|
|||||||
use rustc_lint::{LateLintPass, LateContext};
|
use crate::utils::{is_type_lang_item, match_function_call, paths, span_lint_and_help};
|
||||||
|
use rustc_hir::{lang_items, Expr};
|
||||||
|
use rustc_lint::{LateContext, LateLintPass};
|
||||||
use rustc_session::{declare_lint_pass, declare_tool_lint};
|
use rustc_session::{declare_lint_pass, declare_tool_lint};
|
||||||
use rustc_hir::*;
|
|
||||||
use crate::utils::{match_function_call, is_type_lang_item, paths, span_lint_and_help};
|
|
||||||
|
|
||||||
declare_clippy_lint! {
|
declare_clippy_lint! {
|
||||||
/// **What it does:** Prevents the safe `std::mem::drop` function from being called on `std::mem::ManuallyDrop`.
|
/// **What it does:** Prevents the safe `std::mem::drop` function from being called on `std::mem::ManuallyDrop`.
|
||||||
///
|
///
|
||||||
/// **Why is this bad?** The safe `drop` function does not drop the inner value of a `ManuallyDrop`.
|
/// **Why is this bad?** The safe `drop` function does not drop the inner value of a `ManuallyDrop`.
|
||||||
///
|
///
|
||||||
/// **Known problems:** None.
|
/// **Known problems:** Does not catch cases if the user binds `std::mem::drop`
|
||||||
|
/// to a different name and calls it that way.
|
||||||
///
|
///
|
||||||
/// **Example:**
|
/// **Example:**
|
||||||
///
|
///
|
||||||
@ -20,7 +21,7 @@ declare_clippy_lint! {
|
|||||||
/// ```rust
|
/// ```rust
|
||||||
/// struct S;
|
/// struct S;
|
||||||
/// unsafe {
|
/// unsafe {
|
||||||
/// std::mem::ManuallyDrop::drop(std::mem::ManuallyDrop::new(S));
|
/// std::mem::ManuallyDrop::drop(&mut std::mem::ManuallyDrop::new(S));
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
pub UNDROPPED_MANUALLY_DROPS,
|
pub UNDROPPED_MANUALLY_DROPS,
|
||||||
@ -41,9 +42,9 @@ impl LateLintPass<'tcx> for UndroppedManuallyDrops {
|
|||||||
expr.span,
|
expr.span,
|
||||||
"the inner value of this ManuallyDrop will not be dropped",
|
"the inner value of this ManuallyDrop will not be dropped",
|
||||||
None,
|
None,
|
||||||
"to drop a `ManuallyDrop<T>`, use std::mem::ManuallyDrop::drop"
|
"to drop a `ManuallyDrop<T>`, use std::mem::ManuallyDrop::drop",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,16 +3,24 @@
|
|||||||
struct S;
|
struct S;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let f = drop;
|
let f = std::mem::drop;
|
||||||
let manual = std::mem::ManuallyDrop::new(S);
|
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`
|
// These lines will not drop `S` and should be linted
|
||||||
drop(std::mem::ManuallyDrop::new(S));
|
drop(std::mem::ManuallyDrop::new(S));
|
||||||
f(manual);
|
drop(manual1);
|
||||||
|
|
||||||
// These lines will
|
// FIXME: this line is not linted, though it should be
|
||||||
|
f(manual2);
|
||||||
|
|
||||||
|
// These lines will drop `S` and should be okay.
|
||||||
unsafe {
|
unsafe {
|
||||||
std::mem::ManuallyDrop::drop(std::mem::ManuallyDrop::new(S));
|
std::mem::ManuallyDrop::drop(&mut std::mem::ManuallyDrop::new(S));
|
||||||
std::mem::ManuallyDrop::drop(manual);
|
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…
x
Reference in New Issue
Block a user