@@ -7,102 +7,6 @@ use rustc_lint::{LateContext, LateLintPass};
7
7
use rustc_session:: { declare_lint_pass, declare_tool_lint} ;
8
8
use rustc_span:: sym;
9
9
10
- declare_clippy_lint ! {
11
- /// ### What it does
12
- /// Checks for calls to `std::mem::drop` with a reference
13
- /// instead of an owned value.
14
- ///
15
- /// ### Why is this bad?
16
- /// Calling `drop` on a reference will only drop the
17
- /// reference itself, which is a no-op. It will not call the `drop` method (from
18
- /// the `Drop` trait implementation) on the underlying referenced value, which
19
- /// is likely what was intended.
20
- ///
21
- /// ### Example
22
- /// ```ignore
23
- /// let mut lock_guard = mutex.lock();
24
- /// std::mem::drop(&lock_guard) // Should have been drop(lock_guard), mutex
25
- /// // still locked
26
- /// operation_that_requires_mutex_to_be_unlocked();
27
- /// ```
28
- #[ clippy:: version = "pre 1.29.0" ]
29
- pub DROP_REF ,
30
- correctness,
31
- "calls to `std::mem::drop` with a reference instead of an owned value"
32
- }
33
-
34
- declare_clippy_lint ! {
35
- /// ### What it does
36
- /// Checks for calls to `std::mem::forget` with a reference
37
- /// instead of an owned value.
38
- ///
39
- /// ### Why is this bad?
40
- /// Calling `forget` on a reference will only forget the
41
- /// reference itself, which is a no-op. It will not forget the underlying
42
- /// referenced
43
- /// value, which is likely what was intended.
44
- ///
45
- /// ### Example
46
- /// ```rust
47
- /// let x = Box::new(1);
48
- /// std::mem::forget(&x) // Should have been forget(x), x will still be dropped
49
- /// ```
50
- #[ clippy:: version = "pre 1.29.0" ]
51
- pub FORGET_REF ,
52
- correctness,
53
- "calls to `std::mem::forget` with a reference instead of an owned value"
54
- }
55
-
56
- declare_clippy_lint ! {
57
- /// ### What it does
58
- /// Checks for calls to `std::mem::drop` with a value
59
- /// that derives the Copy trait
60
- ///
61
- /// ### Why is this bad?
62
- /// Calling `std::mem::drop` [does nothing for types that
63
- /// implement Copy](https://doc.rust-lang.org/std/mem/fn.drop.html), since the
64
- /// value will be copied and moved into the function on invocation.
65
- ///
66
- /// ### Example
67
- /// ```rust
68
- /// let x: i32 = 42; // i32 implements Copy
69
- /// std::mem::drop(x) // A copy of x is passed to the function, leaving the
70
- /// // original unaffected
71
- /// ```
72
- #[ clippy:: version = "pre 1.29.0" ]
73
- pub DROP_COPY ,
74
- correctness,
75
- "calls to `std::mem::drop` with a value that implements Copy"
76
- }
77
-
78
- declare_clippy_lint ! {
79
- /// ### What it does
80
- /// Checks for calls to `std::mem::forget` with a value that
81
- /// derives the Copy trait
82
- ///
83
- /// ### Why is this bad?
84
- /// Calling `std::mem::forget` [does nothing for types that
85
- /// implement Copy](https://doc.rust-lang.org/std/mem/fn.drop.html) since the
86
- /// value will be copied and moved into the function on invocation.
87
- ///
88
- /// An alternative, but also valid, explanation is that Copy types do not
89
- /// implement
90
- /// the Drop trait, which means they have no destructors. Without a destructor,
91
- /// there
92
- /// is nothing for `std::mem::forget` to ignore.
93
- ///
94
- /// ### Example
95
- /// ```rust
96
- /// let x: i32 = 42; // i32 implements Copy
97
- /// std::mem::forget(x) // A copy of x is passed to the function, leaving the
98
- /// // original unaffected
99
- /// ```
100
- #[ clippy:: version = "pre 1.29.0" ]
101
- pub FORGET_COPY ,
102
- correctness,
103
- "calls to `std::mem::forget` with a value that implements Copy"
104
- }
105
-
106
10
declare_clippy_lint ! {
107
11
/// ### What it does
108
12
/// Checks for calls to `std::mem::drop` with a value that does not implement `Drop`.
@@ -172,24 +76,12 @@ declare_clippy_lint! {
172
76
"use of safe `std::mem::drop` function to drop a std::mem::ManuallyDrop, which will not drop the inner value"
173
77
}
174
78
175
- const DROP_REF_SUMMARY : & str = "calls to `std::mem::drop` with a reference instead of an owned value. \
176
- Dropping a reference does nothing";
177
- const FORGET_REF_SUMMARY : & str = "calls to `std::mem::forget` with a reference instead of an owned value. \
178
- Forgetting a reference does nothing";
179
- const DROP_COPY_SUMMARY : & str = "calls to `std::mem::drop` with a value that implements `Copy`. \
180
- Dropping a copy leaves the original intact";
181
- const FORGET_COPY_SUMMARY : & str = "calls to `std::mem::forget` with a value that implements `Copy`. \
182
- Forgetting a copy leaves the original intact";
183
79
const DROP_NON_DROP_SUMMARY : & str = "call to `std::mem::drop` with a value that does not implement `Drop`. \
184
80
Dropping such a type only extends its contained lifetimes";
185
81
const FORGET_NON_DROP_SUMMARY : & str = "call to `std::mem::forget` with a value that does not implement `Drop`. \
186
82
Forgetting such a type is the same as dropping it";
187
83
188
84
declare_lint_pass ! ( DropForgetRef => [
189
- DROP_REF ,
190
- FORGET_REF ,
191
- DROP_COPY ,
192
- FORGET_COPY ,
193
85
DROP_NON_DROP ,
194
86
FORGET_NON_DROP ,
195
87
UNDROPPED_MANUALLY_DROPS
@@ -206,10 +98,11 @@ impl<'tcx> LateLintPass<'tcx> for DropForgetRef {
206
98
let is_copy = is_copy ( cx, arg_ty) ;
207
99
let drop_is_single_call_in_arm = is_single_call_in_arm ( cx, arg, expr) ;
208
100
let ( lint, msg) = match fn_name {
209
- sym:: mem_drop if arg_ty. is_ref ( ) && !drop_is_single_call_in_arm => ( DROP_REF , DROP_REF_SUMMARY ) ,
210
- sym:: mem_forget if arg_ty. is_ref ( ) => ( FORGET_REF , FORGET_REF_SUMMARY ) ,
211
- sym:: mem_drop if is_copy && !drop_is_single_call_in_arm => ( DROP_COPY , DROP_COPY_SUMMARY ) ,
212
- sym:: mem_forget if is_copy => ( FORGET_COPY , FORGET_COPY_SUMMARY ) ,
101
+ // early return for uplifted lints: drop_ref, drop_copy, forget_ref, forget_copy
102
+ sym:: mem_drop if arg_ty. is_ref ( ) && !drop_is_single_call_in_arm => return ,
103
+ sym:: mem_forget if arg_ty. is_ref ( ) => return ,
104
+ sym:: mem_drop if is_copy && !drop_is_single_call_in_arm => return ,
105
+ sym:: mem_forget if is_copy => return ,
213
106
sym:: mem_drop if is_type_lang_item ( cx, arg_ty, LangItem :: ManuallyDrop ) => {
214
107
span_lint_and_help (
215
108
cx,
0 commit comments