|
1 |
| -use rustc_hir::{Arm, Expr, ExprKind, Node}; |
| 1 | +use rustc_hir::{Arm, Expr, ExprKind, Node, StmtKind}; |
2 | 2 | use rustc_middle::ty;
|
3 | 3 | use rustc_session::{declare_lint, declare_lint_pass};
|
4 | 4 | use rustc_span::sym;
|
5 | 5 |
|
6 | 6 | use crate::{
|
7 | 7 | lints::{
|
8 |
| - DropCopyDiag, DropRefDiag, ForgetCopyDiag, ForgetRefDiag, UndroppedManuallyDropsDiag, |
9 |
| - UndroppedManuallyDropsSuggestion, |
| 8 | + DropCopyDiag, DropCopySuggestion, DropRefDiag, ForgetCopyDiag, ForgetRefDiag, |
| 9 | + UndroppedManuallyDropsDiag, UndroppedManuallyDropsSuggestion, |
10 | 10 | },
|
11 | 11 | LateContext, LateLintPass, LintContext,
|
12 | 12 | };
|
@@ -164,10 +164,23 @@ impl<'tcx> LateLintPass<'tcx> for DropForgetUseless {
|
164 | 164 | );
|
165 | 165 | }
|
166 | 166 | sym::mem_drop if is_copy && !drop_is_single_call_in_arm => {
|
| 167 | + let sugg = if let Some((_, node)) = cx.tcx.hir().parent_iter(expr.hir_id).nth(0) |
| 168 | + && let Node::Stmt(stmt) = node |
| 169 | + && let StmtKind::Semi(e) = stmt.kind |
| 170 | + && e.hir_id == expr.hir_id |
| 171 | + { |
| 172 | + DropCopySuggestion::Suggestion { |
| 173 | + start_span: expr.span.shrink_to_lo().until(arg.span), |
| 174 | + end_span: arg.span.shrink_to_hi().until(expr.span.shrink_to_hi()), |
| 175 | + } |
| 176 | + } else { |
| 177 | + DropCopySuggestion::Note |
| 178 | + }; |
| 179 | + |
167 | 180 | cx.emit_span_lint(
|
168 | 181 | DROPPING_COPY_TYPES,
|
169 | 182 | expr.span,
|
170 |
| - DropCopyDiag { arg_ty, label: arg.span }, |
| 183 | + DropCopyDiag { arg_ty, label: arg.span, sugg }, |
171 | 184 | );
|
172 | 185 | }
|
173 | 186 | sym::mem_forget if is_copy => {
|
|
0 commit comments