mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Let lint_forgetting_references give the suggestion if possible
This commit is contained in:
parent
d7f0d1f564
commit
ac736d6d88
@ -237,8 +237,6 @@ lint_dropping_copy_types = calls to `std::mem::drop` with a value that implement
|
|||||||
|
|
||||||
lint_dropping_references = calls to `std::mem::drop` with a reference instead of an owned value does nothing
|
lint_dropping_references = calls to `std::mem::drop` with a reference instead of an owned value does nothing
|
||||||
.label = argument has type `{$arg_ty}`
|
.label = argument has type `{$arg_ty}`
|
||||||
.note = use `let _ = ...` to ignore the expression or result
|
|
||||||
.suggestion = use `let _ = ...` to ignore the expression or result
|
|
||||||
|
|
||||||
lint_duplicate_macro_attribute =
|
lint_duplicate_macro_attribute =
|
||||||
duplicated attribute
|
duplicated attribute
|
||||||
@ -273,12 +271,9 @@ lint_for_loops_over_fallibles =
|
|||||||
|
|
||||||
lint_forgetting_copy_types = calls to `std::mem::forget` with a value that implements `Copy` does nothing
|
lint_forgetting_copy_types = calls to `std::mem::forget` with a value that implements `Copy` does nothing
|
||||||
.label = argument has type `{$arg_ty}`
|
.label = argument has type `{$arg_ty}`
|
||||||
.note = use `let _ = ...` to ignore the expression or result
|
|
||||||
.suggestion = use `let _ = ...` to ignore the expression or result
|
|
||||||
|
|
||||||
lint_forgetting_references = calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
lint_forgetting_references = calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
.label = argument has type `{$arg_ty}`
|
.label = argument has type `{$arg_ty}`
|
||||||
.note = use `let _ = ...` to ignore the expression or result
|
|
||||||
|
|
||||||
lint_hidden_glob_reexport = private item shadows public glob re-export
|
lint_hidden_glob_reexport = private item shadows public glob re-export
|
||||||
.note_glob_reexport = the name `{$name}` in the {$namespace} namespace is supposed to be publicly re-exported here
|
.note_glob_reexport = the name `{$name}` in the {$namespace} namespace is supposed to be publicly re-exported here
|
||||||
@ -897,6 +892,8 @@ lint_unused_op = unused {$op} that must be used
|
|||||||
|
|
||||||
lint_unused_result = unused result of type `{$ty}`
|
lint_unused_result = unused result of type `{$ty}`
|
||||||
|
|
||||||
|
lint_use_let_underscore_ignore_suggestion = use `let _ = ...` to ignore the expression or result
|
||||||
|
|
||||||
lint_variant_size_differences =
|
lint_variant_size_differences =
|
||||||
enum variant is more than three times larger ({$largest} bytes) than the next largest
|
enum variant is more than three times larger ({$largest} bytes) than the next largest
|
||||||
|
|
||||||
|
@ -5,8 +5,9 @@ use rustc_span::sym;
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
lints::{
|
lints::{
|
||||||
DropCopyDiag, DropRefDiag, ForgetCopyDiag, ForgetRefDiag, IgnoreDropSuggestion,
|
DropCopyDiag, DropCopySuggestion, DropRefDiag, ForgetCopyDiag, ForgetRefDiag,
|
||||||
UndroppedManuallyDropsDiag, UndroppedManuallyDropsSuggestion,
|
UndroppedManuallyDropsDiag, UndroppedManuallyDropsSuggestion,
|
||||||
|
UseLetUnderscoreIgnoreSuggestion,
|
||||||
},
|
},
|
||||||
LateContext, LateLintPass, LintContext,
|
LateContext, LateLintPass, LintContext,
|
||||||
};
|
};
|
||||||
@ -148,31 +149,37 @@ impl<'tcx> LateLintPass<'tcx> for DropForgetUseless {
|
|||||||
let arg_ty = cx.typeck_results().expr_ty(arg);
|
let arg_ty = cx.typeck_results().expr_ty(arg);
|
||||||
let is_copy = arg_ty.is_copy_modulo_regions(cx.tcx, cx.param_env);
|
let is_copy = arg_ty.is_copy_modulo_regions(cx.tcx, cx.param_env);
|
||||||
let drop_is_single_call_in_arm = is_single_call_in_arm(cx, arg, expr);
|
let drop_is_single_call_in_arm = is_single_call_in_arm(cx, arg, expr);
|
||||||
let sugg = if let Some((_, node)) = cx.tcx.hir().parent_iter(expr.hir_id).nth(0)
|
let let_underscore_ignore_sugg = || {
|
||||||
&& let Node::Stmt(stmt) = node
|
if let Some((_, node)) = cx.tcx.hir().parent_iter(expr.hir_id).nth(0)
|
||||||
&& let StmtKind::Semi(e) = stmt.kind
|
&& let Node::Stmt(stmt) = node
|
||||||
&& e.hir_id == expr.hir_id
|
&& let StmtKind::Semi(e) = stmt.kind
|
||||||
{
|
&& e.hir_id == expr.hir_id
|
||||||
IgnoreDropSuggestion::Suggestion {
|
{
|
||||||
start_span: expr.span.shrink_to_lo().until(arg.span),
|
UseLetUnderscoreIgnoreSuggestion::Suggestion {
|
||||||
end_span: arg.span.shrink_to_hi().until(expr.span.shrink_to_hi()),
|
start_span: expr.span.shrink_to_lo().until(arg.span),
|
||||||
|
end_span: arg.span.shrink_to_hi().until(expr.span.shrink_to_hi()),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
UseLetUnderscoreIgnoreSuggestion::Note
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
IgnoreDropSuggestion::Note
|
|
||||||
};
|
};
|
||||||
match fn_name {
|
match fn_name {
|
||||||
sym::mem_drop if arg_ty.is_ref() && !drop_is_single_call_in_arm => {
|
sym::mem_drop if arg_ty.is_ref() && !drop_is_single_call_in_arm => {
|
||||||
cx.emit_span_lint(
|
cx.emit_span_lint(
|
||||||
DROPPING_REFERENCES,
|
DROPPING_REFERENCES,
|
||||||
expr.span,
|
expr.span,
|
||||||
DropRefDiag { arg_ty, label: arg.span, sugg },
|
DropRefDiag { arg_ty, label: arg.span, sugg: let_underscore_ignore_sugg() },
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
sym::mem_forget if arg_ty.is_ref() => {
|
sym::mem_forget if arg_ty.is_ref() => {
|
||||||
cx.emit_span_lint(
|
cx.emit_span_lint(
|
||||||
FORGETTING_REFERENCES,
|
FORGETTING_REFERENCES,
|
||||||
expr.span,
|
expr.span,
|
||||||
ForgetRefDiag { arg_ty, label: arg.span },
|
ForgetRefDiag {
|
||||||
|
arg_ty,
|
||||||
|
label: arg.span,
|
||||||
|
sugg: let_underscore_ignore_sugg(),
|
||||||
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
sym::mem_drop if is_copy && !drop_is_single_call_in_arm => {
|
sym::mem_drop if is_copy && !drop_is_single_call_in_arm => {
|
||||||
@ -199,7 +206,11 @@ impl<'tcx> LateLintPass<'tcx> for DropForgetUseless {
|
|||||||
cx.emit_span_lint(
|
cx.emit_span_lint(
|
||||||
FORGETTING_COPY_TYPES,
|
FORGETTING_COPY_TYPES,
|
||||||
expr.span,
|
expr.span,
|
||||||
ForgetCopyDiag { arg_ty, label: arg.span, sugg },
|
ForgetCopyDiag {
|
||||||
|
arg_ty,
|
||||||
|
label: arg.span,
|
||||||
|
sugg: let_underscore_ignore_sugg(),
|
||||||
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
sym::mem_drop
|
sym::mem_drop
|
||||||
|
@ -657,10 +657,14 @@ pub struct ForLoopsOverFalliblesSuggestion<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Subdiagnostic)]
|
#[derive(Subdiagnostic)]
|
||||||
pub enum IgnoreDropSuggestion {
|
pub enum UseLetUnderscoreIgnoreSuggestion {
|
||||||
#[note(lint_note)]
|
#[note(lint_use_let_underscore_ignore_suggestion)]
|
||||||
Note,
|
Note,
|
||||||
#[multipart_suggestion(lint_suggestion, style = "verbose", applicability = "maybe-incorrect")]
|
#[multipart_suggestion(
|
||||||
|
lint_use_let_underscore_ignore_suggestion,
|
||||||
|
style = "verbose",
|
||||||
|
applicability = "maybe-incorrect"
|
||||||
|
)]
|
||||||
Suggestion {
|
Suggestion {
|
||||||
#[suggestion_part(code = "let _ = ")]
|
#[suggestion_part(code = "let _ = ")]
|
||||||
start_span: Span,
|
start_span: Span,
|
||||||
@ -677,7 +681,7 @@ pub struct DropRefDiag<'a> {
|
|||||||
#[label]
|
#[label]
|
||||||
pub label: Span,
|
pub label: Span,
|
||||||
#[subdiagnostic]
|
#[subdiagnostic]
|
||||||
pub sugg: IgnoreDropSuggestion,
|
pub sugg: UseLetUnderscoreIgnoreSuggestion,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(LintDiagnostic)]
|
#[derive(LintDiagnostic)]
|
||||||
@ -705,11 +709,12 @@ pub enum DropCopySuggestion {
|
|||||||
|
|
||||||
#[derive(LintDiagnostic)]
|
#[derive(LintDiagnostic)]
|
||||||
#[diag(lint_forgetting_references)]
|
#[diag(lint_forgetting_references)]
|
||||||
#[note]
|
|
||||||
pub struct ForgetRefDiag<'a> {
|
pub struct ForgetRefDiag<'a> {
|
||||||
pub arg_ty: Ty<'a>,
|
pub arg_ty: Ty<'a>,
|
||||||
#[label]
|
#[label]
|
||||||
pub label: Span,
|
pub label: Span,
|
||||||
|
#[subdiagnostic]
|
||||||
|
pub sugg: UseLetUnderscoreIgnoreSuggestion,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(LintDiagnostic)]
|
#[derive(LintDiagnostic)]
|
||||||
@ -719,7 +724,7 @@ pub struct ForgetCopyDiag<'a> {
|
|||||||
#[label]
|
#[label]
|
||||||
pub label: Span,
|
pub label: Span,
|
||||||
#[subdiagnostic]
|
#[subdiagnostic]
|
||||||
pub sugg: IgnoreDropSuggestion,
|
pub sugg: UseLetUnderscoreIgnoreSuggestion,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(LintDiagnostic)]
|
#[derive(LintDiagnostic)]
|
||||||
|
@ -39,8 +39,12 @@ LL | drop(s3);
|
|||||||
| |
|
| |
|
||||||
| argument has type `&SomeStruct`
|
| argument has type `&SomeStruct`
|
||||||
|
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
|
||||||
= note: `#[warn(dropping_references)]` on by default
|
= note: `#[warn(dropping_references)]` on by default
|
||||||
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - drop(s3);
|
||||||
|
LL + let _ = s3;
|
||||||
|
|
|
||||||
|
|
||||||
warning: calls to `std::mem::drop` with a value that implements `Copy` does nothing
|
warning: calls to `std::mem::drop` with a value that implements `Copy` does nothing
|
||||||
--> $DIR/dropping_copy_types.rs:37:5
|
--> $DIR/dropping_copy_types.rs:37:5
|
||||||
@ -64,7 +68,11 @@ LL | drop(s5);
|
|||||||
| |
|
| |
|
||||||
| argument has type `&SomeStruct`
|
| argument has type `&SomeStruct`
|
||||||
|
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - drop(s5);
|
||||||
|
LL + let _ = s5;
|
||||||
|
|
|
||||||
|
|
||||||
warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
|
warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
|
||||||
--> $DIR/dropping_copy_types.rs:50:5
|
--> $DIR/dropping_copy_types.rs:50:5
|
||||||
@ -74,7 +82,11 @@ LL | drop(a2);
|
|||||||
| |
|
| |
|
||||||
| argument has type `&AnotherStruct`
|
| argument has type `&AnotherStruct`
|
||||||
|
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - drop(a2);
|
||||||
|
LL + let _ = a2;
|
||||||
|
|
|
||||||
|
|
||||||
warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
|
warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
|
||||||
--> $DIR/dropping_copy_types.rs:52:5
|
--> $DIR/dropping_copy_types.rs:52:5
|
||||||
@ -84,7 +96,11 @@ LL | drop(a4);
|
|||||||
| |
|
| |
|
||||||
| argument has type `&AnotherStruct`
|
| argument has type `&AnotherStruct`
|
||||||
|
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - drop(a4);
|
||||||
|
LL + let _ = a4;
|
||||||
|
|
|
||||||
|
|
||||||
warning: calls to `std::mem::drop` with a value that implements `Copy` does nothing
|
warning: calls to `std::mem::drop` with a value that implements `Copy` does nothing
|
||||||
--> $DIR/dropping_copy_types.rs:71:13
|
--> $DIR/dropping_copy_types.rs:71:13
|
||||||
|
@ -39,8 +39,12 @@ LL | forget(s3);
|
|||||||
| |
|
| |
|
||||||
| argument has type `&SomeStruct`
|
| argument has type `&SomeStruct`
|
||||||
|
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
|
||||||
= note: `#[warn(forgetting_references)]` on by default
|
= note: `#[warn(forgetting_references)]` on by default
|
||||||
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(s3);
|
||||||
|
LL + let _ = s3;
|
||||||
|
|
|
||||||
|
|
||||||
warning: calls to `std::mem::forget` with a value that implements `Copy` does nothing
|
warning: calls to `std::mem::forget` with a value that implements `Copy` does nothing
|
||||||
--> $DIR/forgetting_copy_types.rs:37:5
|
--> $DIR/forgetting_copy_types.rs:37:5
|
||||||
@ -64,7 +68,11 @@ LL | forget(s5);
|
|||||||
| |
|
| |
|
||||||
| argument has type `&SomeStruct`
|
| argument has type `&SomeStruct`
|
||||||
|
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(s5);
|
||||||
|
LL + let _ = s5;
|
||||||
|
|
|
||||||
|
|
||||||
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
--> $DIR/forgetting_copy_types.rs:50:5
|
--> $DIR/forgetting_copy_types.rs:50:5
|
||||||
@ -74,7 +82,11 @@ LL | forget(a2);
|
|||||||
| |
|
| |
|
||||||
| argument has type `&AnotherStruct`
|
| argument has type `&AnotherStruct`
|
||||||
|
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(a2);
|
||||||
|
LL + let _ = a2;
|
||||||
|
|
|
||||||
|
|
||||||
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
--> $DIR/forgetting_copy_types.rs:52:5
|
--> $DIR/forgetting_copy_types.rs:52:5
|
||||||
@ -84,7 +96,11 @@ LL | forget(a3);
|
|||||||
| |
|
| |
|
||||||
| argument has type `&AnotherStruct`
|
| argument has type `&AnotherStruct`
|
||||||
|
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(a3);
|
||||||
|
LL + let _ = a3;
|
||||||
|
|
|
||||||
|
|
||||||
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
--> $DIR/forgetting_copy_types.rs:53:5
|
--> $DIR/forgetting_copy_types.rs:53:5
|
||||||
@ -94,7 +110,11 @@ LL | forget(a4);
|
|||||||
| |
|
| |
|
||||||
| argument has type `&AnotherStruct`
|
| argument has type `&AnotherStruct`
|
||||||
|
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(a4);
|
||||||
|
LL + let _ = a4;
|
||||||
|
|
|
||||||
|
|
||||||
warning: 8 warnings emitted
|
warning: 8 warnings emitted
|
||||||
|
|
||||||
|
40
tests/ui/lint/forgetting_references-can-fixed.fixed
Normal file
40
tests/ui/lint/forgetting_references-can-fixed.fixed
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
//@ check-fail
|
||||||
|
//@ run-rustfix
|
||||||
|
|
||||||
|
#![deny(forgetting_references)]
|
||||||
|
|
||||||
|
use std::mem::forget;
|
||||||
|
|
||||||
|
struct SomeStruct;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _ = &SomeStruct; //~ ERROR calls to `std::mem::forget`
|
||||||
|
|
||||||
|
let mut owned = SomeStruct;
|
||||||
|
let _ = &owned; //~ ERROR calls to `std::mem::forget`
|
||||||
|
let _ = &&owned; //~ ERROR calls to `std::mem::forget`
|
||||||
|
let _ = &mut owned; //~ ERROR calls to `std::mem::forget`
|
||||||
|
forget(owned);
|
||||||
|
|
||||||
|
let reference1 = &SomeStruct;
|
||||||
|
let _ = &*reference1; //~ ERROR calls to `std::mem::forget`
|
||||||
|
|
||||||
|
let reference2 = &mut SomeStruct;
|
||||||
|
let _ = reference2; //~ ERROR calls to `std::mem::forget`
|
||||||
|
|
||||||
|
let ref reference3 = SomeStruct;
|
||||||
|
let _ = reference3; //~ ERROR calls to `std::mem::forget`
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
fn test_generic_fn_forget<T>(val: T) {
|
||||||
|
let _ = &val; //~ ERROR calls to `std::mem::forget`
|
||||||
|
forget(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
fn test_similarly_named_function() {
|
||||||
|
fn forget<T>(_val: T) {}
|
||||||
|
forget(&SomeStruct); //OK; call to unrelated function which happens to have the same name
|
||||||
|
let _ = &SomeStruct; //~ ERROR calls to `std::mem::forget`
|
||||||
|
}
|
40
tests/ui/lint/forgetting_references-can-fixed.rs
Normal file
40
tests/ui/lint/forgetting_references-can-fixed.rs
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
//@ check-fail
|
||||||
|
//@ run-rustfix
|
||||||
|
|
||||||
|
#![deny(forgetting_references)]
|
||||||
|
|
||||||
|
use std::mem::forget;
|
||||||
|
|
||||||
|
struct SomeStruct;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
forget(&SomeStruct); //~ ERROR calls to `std::mem::forget`
|
||||||
|
|
||||||
|
let mut owned = SomeStruct;
|
||||||
|
forget(&owned); //~ ERROR calls to `std::mem::forget`
|
||||||
|
forget(&&owned); //~ ERROR calls to `std::mem::forget`
|
||||||
|
forget(&mut owned); //~ ERROR calls to `std::mem::forget`
|
||||||
|
forget(owned);
|
||||||
|
|
||||||
|
let reference1 = &SomeStruct;
|
||||||
|
forget(&*reference1); //~ ERROR calls to `std::mem::forget`
|
||||||
|
|
||||||
|
let reference2 = &mut SomeStruct;
|
||||||
|
forget(reference2); //~ ERROR calls to `std::mem::forget`
|
||||||
|
|
||||||
|
let ref reference3 = SomeStruct;
|
||||||
|
forget(reference3); //~ ERROR calls to `std::mem::forget`
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
fn test_generic_fn_forget<T>(val: T) {
|
||||||
|
forget(&val); //~ ERROR calls to `std::mem::forget`
|
||||||
|
forget(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
fn test_similarly_named_function() {
|
||||||
|
fn forget<T>(_val: T) {}
|
||||||
|
forget(&SomeStruct); //OK; call to unrelated function which happens to have the same name
|
||||||
|
std::mem::forget(&SomeStruct); //~ ERROR calls to `std::mem::forget`
|
||||||
|
}
|
133
tests/ui/lint/forgetting_references-can-fixed.stderr
Normal file
133
tests/ui/lint/forgetting_references-can-fixed.stderr
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
error: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
|
--> $DIR/forgetting_references-can-fixed.rs:11:5
|
||||||
|
|
|
||||||
|
LL | forget(&SomeStruct);
|
||||||
|
| ^^^^^^^-----------^
|
||||||
|
| |
|
||||||
|
| argument has type `&SomeStruct`
|
||||||
|
|
|
||||||
|
note: the lint level is defined here
|
||||||
|
--> $DIR/forgetting_references-can-fixed.rs:4:9
|
||||||
|
|
|
||||||
|
LL | #![deny(forgetting_references)]
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(&SomeStruct);
|
||||||
|
LL + let _ = &SomeStruct;
|
||||||
|
|
|
||||||
|
|
||||||
|
error: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
|
--> $DIR/forgetting_references-can-fixed.rs:14:5
|
||||||
|
|
|
||||||
|
LL | forget(&owned);
|
||||||
|
| ^^^^^^^------^
|
||||||
|
| |
|
||||||
|
| argument has type `&SomeStruct`
|
||||||
|
|
|
||||||
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(&owned);
|
||||||
|
LL + let _ = &owned;
|
||||||
|
|
|
||||||
|
|
||||||
|
error: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
|
--> $DIR/forgetting_references-can-fixed.rs:15:5
|
||||||
|
|
|
||||||
|
LL | forget(&&owned);
|
||||||
|
| ^^^^^^^-------^
|
||||||
|
| |
|
||||||
|
| argument has type `&&SomeStruct`
|
||||||
|
|
|
||||||
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(&&owned);
|
||||||
|
LL + let _ = &&owned;
|
||||||
|
|
|
||||||
|
|
||||||
|
error: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
|
--> $DIR/forgetting_references-can-fixed.rs:16:5
|
||||||
|
|
|
||||||
|
LL | forget(&mut owned);
|
||||||
|
| ^^^^^^^----------^
|
||||||
|
| |
|
||||||
|
| argument has type `&mut SomeStruct`
|
||||||
|
|
|
||||||
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(&mut owned);
|
||||||
|
LL + let _ = &mut owned;
|
||||||
|
|
|
||||||
|
|
||||||
|
error: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
|
--> $DIR/forgetting_references-can-fixed.rs:20:5
|
||||||
|
|
|
||||||
|
LL | forget(&*reference1);
|
||||||
|
| ^^^^^^^------------^
|
||||||
|
| |
|
||||||
|
| argument has type `&SomeStruct`
|
||||||
|
|
|
||||||
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(&*reference1);
|
||||||
|
LL + let _ = &*reference1;
|
||||||
|
|
|
||||||
|
|
||||||
|
error: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
|
--> $DIR/forgetting_references-can-fixed.rs:23:5
|
||||||
|
|
|
||||||
|
LL | forget(reference2);
|
||||||
|
| ^^^^^^^----------^
|
||||||
|
| |
|
||||||
|
| argument has type `&mut SomeStruct`
|
||||||
|
|
|
||||||
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(reference2);
|
||||||
|
LL + let _ = reference2;
|
||||||
|
|
|
||||||
|
|
||||||
|
error: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
|
--> $DIR/forgetting_references-can-fixed.rs:26:5
|
||||||
|
|
|
||||||
|
LL | forget(reference3);
|
||||||
|
| ^^^^^^^----------^
|
||||||
|
| |
|
||||||
|
| argument has type `&SomeStruct`
|
||||||
|
|
|
||||||
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(reference3);
|
||||||
|
LL + let _ = reference3;
|
||||||
|
|
|
||||||
|
|
||||||
|
error: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
|
--> $DIR/forgetting_references-can-fixed.rs:31:5
|
||||||
|
|
|
||||||
|
LL | forget(&val);
|
||||||
|
| ^^^^^^^----^
|
||||||
|
| |
|
||||||
|
| argument has type `&T`
|
||||||
|
|
|
||||||
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(&val);
|
||||||
|
LL + let _ = &val;
|
||||||
|
|
|
||||||
|
|
||||||
|
error: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
|
--> $DIR/forgetting_references-can-fixed.rs:39:5
|
||||||
|
|
|
||||||
|
LL | std::mem::forget(&SomeStruct);
|
||||||
|
| ^^^^^^^^^^^^^^^^^-----------^
|
||||||
|
| |
|
||||||
|
| argument has type `&SomeStruct`
|
||||||
|
|
|
||||||
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - std::mem::forget(&SomeStruct);
|
||||||
|
LL + let _ = &SomeStruct;
|
||||||
|
|
|
||||||
|
|
||||||
|
error: aborting due to 9 previous errors
|
||||||
|
|
@ -23,6 +23,16 @@ fn main() {
|
|||||||
|
|
||||||
let ref reference3 = SomeStruct;
|
let ref reference3 = SomeStruct;
|
||||||
forget(reference3); //~ WARN calls to `std::mem::forget`
|
forget(reference3); //~ WARN calls to `std::mem::forget`
|
||||||
|
|
||||||
|
let ref reference4 = SomeStruct;
|
||||||
|
|
||||||
|
let a = 1;
|
||||||
|
match a {
|
||||||
|
1 => forget(&*reference1), //~ WARN calls to `std::mem::forget`
|
||||||
|
2 => forget(reference3), //~ WARN calls to `std::mem::forget`
|
||||||
|
3 => forget(reference4), //~ WARN calls to `std::mem::forget`
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
|
@ -6,12 +6,16 @@ LL | forget(&SomeStruct);
|
|||||||
| |
|
| |
|
||||||
| argument has type `&SomeStruct`
|
| argument has type `&SomeStruct`
|
||||||
|
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
|
||||||
note: the lint level is defined here
|
note: the lint level is defined here
|
||||||
--> $DIR/forgetting_references.rs:3:9
|
--> $DIR/forgetting_references.rs:3:9
|
||||||
|
|
|
|
||||||
LL | #![warn(forgetting_references)]
|
LL | #![warn(forgetting_references)]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(&SomeStruct);
|
||||||
|
LL + let _ = &SomeStruct;
|
||||||
|
|
|
||||||
|
|
||||||
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
--> $DIR/forgetting_references.rs:13:5
|
--> $DIR/forgetting_references.rs:13:5
|
||||||
@ -21,7 +25,11 @@ LL | forget(&owned);
|
|||||||
| |
|
| |
|
||||||
| argument has type `&SomeStruct`
|
| argument has type `&SomeStruct`
|
||||||
|
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(&owned);
|
||||||
|
LL + let _ = &owned;
|
||||||
|
|
|
||||||
|
|
||||||
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
--> $DIR/forgetting_references.rs:14:5
|
--> $DIR/forgetting_references.rs:14:5
|
||||||
@ -31,7 +39,11 @@ LL | forget(&&owned);
|
|||||||
| |
|
| |
|
||||||
| argument has type `&&SomeStruct`
|
| argument has type `&&SomeStruct`
|
||||||
|
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(&&owned);
|
||||||
|
LL + let _ = &&owned;
|
||||||
|
|
|
||||||
|
|
||||||
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
--> $DIR/forgetting_references.rs:15:5
|
--> $DIR/forgetting_references.rs:15:5
|
||||||
@ -41,7 +53,11 @@ LL | forget(&mut owned);
|
|||||||
| |
|
| |
|
||||||
| argument has type `&mut SomeStruct`
|
| argument has type `&mut SomeStruct`
|
||||||
|
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(&mut owned);
|
||||||
|
LL + let _ = &mut owned;
|
||||||
|
|
|
||||||
|
|
||||||
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
--> $DIR/forgetting_references.rs:19:5
|
--> $DIR/forgetting_references.rs:19:5
|
||||||
@ -51,7 +67,11 @@ LL | forget(&*reference1);
|
|||||||
| |
|
| |
|
||||||
| argument has type `&SomeStruct`
|
| argument has type `&SomeStruct`
|
||||||
|
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(&*reference1);
|
||||||
|
LL + let _ = &*reference1;
|
||||||
|
|
|
||||||
|
|
||||||
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
--> $DIR/forgetting_references.rs:22:5
|
--> $DIR/forgetting_references.rs:22:5
|
||||||
@ -61,7 +81,11 @@ LL | forget(reference2);
|
|||||||
| |
|
| |
|
||||||
| argument has type `&mut SomeStruct`
|
| argument has type `&mut SomeStruct`
|
||||||
|
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(reference2);
|
||||||
|
LL + let _ = reference2;
|
||||||
|
|
|
||||||
|
|
||||||
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
--> $DIR/forgetting_references.rs:25:5
|
--> $DIR/forgetting_references.rs:25:5
|
||||||
@ -71,27 +95,69 @@ LL | forget(reference3);
|
|||||||
| |
|
| |
|
||||||
| argument has type `&SomeStruct`
|
| argument has type `&SomeStruct`
|
||||||
|
|
|
|
||||||
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(reference3);
|
||||||
|
LL + let _ = reference3;
|
||||||
|
|
|
||||||
|
|
||||||
|
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
|
--> $DIR/forgetting_references.rs:31:14
|
||||||
|
|
|
||||||
|
LL | 1 => forget(&*reference1),
|
||||||
|
| ^^^^^^^------------^
|
||||||
|
| |
|
||||||
|
| argument has type `&SomeStruct`
|
||||||
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
= note: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
||||||
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
--> $DIR/forgetting_references.rs:30:5
|
--> $DIR/forgetting_references.rs:32:14
|
||||||
|
|
|
||||||
|
LL | 2 => forget(reference3),
|
||||||
|
| ^^^^^^^----------^
|
||||||
|
| |
|
||||||
|
| argument has type `&SomeStruct`
|
||||||
|
|
|
||||||
|
= note: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
||||||
|
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
|
--> $DIR/forgetting_references.rs:33:14
|
||||||
|
|
|
||||||
|
LL | 3 => forget(reference4),
|
||||||
|
| ^^^^^^^----------^
|
||||||
|
| |
|
||||||
|
| argument has type `&SomeStruct`
|
||||||
|
|
|
||||||
|
= note: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
||||||
|
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
|
--> $DIR/forgetting_references.rs:40:5
|
||||||
|
|
|
|
||||||
LL | forget(&val);
|
LL | forget(&val);
|
||||||
| ^^^^^^^----^
|
| ^^^^^^^----^
|
||||||
| |
|
| |
|
||||||
| argument has type `&T`
|
| argument has type `&T`
|
||||||
|
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - forget(&val);
|
||||||
|
LL + let _ = &val;
|
||||||
|
|
|
||||||
|
|
||||||
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
|
||||||
--> $DIR/forgetting_references.rs:38:5
|
--> $DIR/forgetting_references.rs:48:5
|
||||||
|
|
|
|
||||||
LL | std::mem::forget(&SomeStruct);
|
LL | std::mem::forget(&SomeStruct);
|
||||||
| ^^^^^^^^^^^^^^^^^-----------^
|
| ^^^^^^^^^^^^^^^^^-----------^
|
||||||
| |
|
| |
|
||||||
| argument has type `&SomeStruct`
|
| argument has type `&SomeStruct`
|
||||||
|
|
|
|
||||||
= note: use `let _ = ...` to ignore the expression or result
|
help: use `let _ = ...` to ignore the expression or result
|
||||||
|
|
|
||||||
|
LL - std::mem::forget(&SomeStruct);
|
||||||
|
LL + let _ = &SomeStruct;
|
||||||
|
|
|
||||||
|
|
||||||
warning: 9 warnings emitted
|
warning: 12 warnings emitted
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user