about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_lint/messages.ftl2
-rw-r--r--compiler/rustc_lint/src/drop_forget_useless.rs2
-rw-r--r--compiler/rustc_lint/src/lints.rs3
-rw-r--r--tests/ui/lint/forgetting_copy_types-can-fixed.fixed22
-rw-r--r--tests/ui/lint/forgetting_copy_types-can-fixed.rs22
-rw-r--r--tests/ui/lint/forgetting_copy_types-can-fixed.stderr49
-rw-r--r--tests/ui/lint/forgetting_copy_types.stderr18
7 files changed, 113 insertions, 5 deletions
diff --git a/compiler/rustc_lint/messages.ftl b/compiler/rustc_lint/messages.ftl
index 805001718ea..ecd8bafe0ad 100644
--- a/compiler/rustc_lint/messages.ftl
+++ b/compiler/rustc_lint/messages.ftl
@@ -274,6 +274,8 @@ lint_for_loops_over_fallibles =
 lint_forgetting_copy_types = calls to `std::mem::forget` with a value that implements `Copy` does nothing
     .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
     .label = argument has type `{$arg_ty}`
     .note = use `let _ = ...` to ignore the expression or result
diff --git a/compiler/rustc_lint/src/drop_forget_useless.rs b/compiler/rustc_lint/src/drop_forget_useless.rs
index 3166556448b..8b8a8f732e7 100644
--- a/compiler/rustc_lint/src/drop_forget_useless.rs
+++ b/compiler/rustc_lint/src/drop_forget_useless.rs
@@ -199,7 +199,7 @@ impl<'tcx> LateLintPass<'tcx> for DropForgetUseless {
                     cx.emit_span_lint(
                         FORGETTING_COPY_TYPES,
                         expr.span,
-                        ForgetCopyDiag { arg_ty, label: arg.span },
+                        ForgetCopyDiag { arg_ty, label: arg.span, sugg },
                     );
                 }
                 sym::mem_drop
diff --git a/compiler/rustc_lint/src/lints.rs b/compiler/rustc_lint/src/lints.rs
index 1c061ce25a6..a91180dfb24 100644
--- a/compiler/rustc_lint/src/lints.rs
+++ b/compiler/rustc_lint/src/lints.rs
@@ -714,11 +714,12 @@ pub struct ForgetRefDiag<'a> {
 
 #[derive(LintDiagnostic)]
 #[diag(lint_forgetting_copy_types)]
-#[note]
 pub struct ForgetCopyDiag<'a> {
     pub arg_ty: Ty<'a>,
     #[label]
     pub label: Span,
+    #[subdiagnostic]
+    pub sugg: IgnoreDropSuggestion,
 }
 
 #[derive(LintDiagnostic)]
diff --git a/tests/ui/lint/forgetting_copy_types-can-fixed.fixed b/tests/ui/lint/forgetting_copy_types-can-fixed.fixed
new file mode 100644
index 00000000000..c5d65ecc1d4
--- /dev/null
+++ b/tests/ui/lint/forgetting_copy_types-can-fixed.fixed
@@ -0,0 +1,22 @@
+//@ check-fail
+//@ run-rustfix
+
+#![deny(forgetting_copy_types)]
+#![allow(unused_mut)]
+#![allow(unused_imports)]
+
+use std::vec::Vec;
+use std::mem::forget;
+
+#[derive(Copy, Clone)]
+struct SomeStruct;
+
+fn main() {
+    let s1 = SomeStruct {};
+    let s2 = s1;
+    let mut s3 = s1;
+
+    let _ = s1; //~ ERROR calls to `std::mem::forget`
+    let _ = s2; //~ ERROR calls to `std::mem::forget`
+    let _ = s3; //~ ERROR calls to `std::mem::forget`
+}
diff --git a/tests/ui/lint/forgetting_copy_types-can-fixed.rs b/tests/ui/lint/forgetting_copy_types-can-fixed.rs
new file mode 100644
index 00000000000..c5572294280
--- /dev/null
+++ b/tests/ui/lint/forgetting_copy_types-can-fixed.rs
@@ -0,0 +1,22 @@
+//@ check-fail
+//@ run-rustfix
+
+#![deny(forgetting_copy_types)]
+#![allow(unused_mut)]
+#![allow(unused_imports)]
+
+use std::vec::Vec;
+use std::mem::forget;
+
+#[derive(Copy, Clone)]
+struct SomeStruct;
+
+fn main() {
+    let s1 = SomeStruct {};
+    let s2 = s1;
+    let mut s3 = s1;
+
+    forget(s1); //~ ERROR calls to `std::mem::forget`
+    forget(s2); //~ ERROR calls to `std::mem::forget`
+    forget(s3); //~ ERROR calls to `std::mem::forget`
+}
diff --git a/tests/ui/lint/forgetting_copy_types-can-fixed.stderr b/tests/ui/lint/forgetting_copy_types-can-fixed.stderr
new file mode 100644
index 00000000000..cb7bbf02222
--- /dev/null
+++ b/tests/ui/lint/forgetting_copy_types-can-fixed.stderr
@@ -0,0 +1,49 @@
+error: calls to `std::mem::forget` with a value that implements `Copy` does nothing
+  --> $DIR/forgetting_copy_types-can-fixed.rs:19:5
+   |
+LL |     forget(s1);
+   |     ^^^^^^^--^
+   |            |
+   |            argument has type `SomeStruct`
+   |
+note: the lint level is defined here
+  --> $DIR/forgetting_copy_types-can-fixed.rs:4:9
+   |
+LL | #![deny(forgetting_copy_types)]
+   |         ^^^^^^^^^^^^^^^^^^^^^
+help: use `let _ = ...` to ignore the expression or result
+   |
+LL -     forget(s1);
+LL +     let _ = s1;
+   |
+
+error: calls to `std::mem::forget` with a value that implements `Copy` does nothing
+  --> $DIR/forgetting_copy_types-can-fixed.rs:20:5
+   |
+LL |     forget(s2);
+   |     ^^^^^^^--^
+   |            |
+   |            argument has type `SomeStruct`
+   |
+help: use `let _ = ...` to ignore the expression or result
+   |
+LL -     forget(s2);
+LL +     let _ = s2;
+   |
+
+error: calls to `std::mem::forget` with a value that implements `Copy` does nothing
+  --> $DIR/forgetting_copy_types-can-fixed.rs:21:5
+   |
+LL |     forget(s3);
+   |     ^^^^^^^--^
+   |            |
+   |            argument has type `SomeStruct`
+   |
+help: use `let _ = ...` to ignore the expression or result
+   |
+LL -     forget(s3);
+LL +     let _ = s3;
+   |
+
+error: aborting due to 3 previous errors
+
diff --git a/tests/ui/lint/forgetting_copy_types.stderr b/tests/ui/lint/forgetting_copy_types.stderr
index 36d1ef5c53e..a2b07351d79 100644
--- a/tests/ui/lint/forgetting_copy_types.stderr
+++ b/tests/ui/lint/forgetting_copy_types.stderr
@@ -6,12 +6,16 @@ LL |     forget(s1);
    |            |
    |            argument has type `SomeStruct`
    |
-   = note: use `let _ = ...` to ignore the expression or result
 note: the lint level is defined here
   --> $DIR/forgetting_copy_types.rs:3:9
    |
 LL | #![warn(forgetting_copy_types)]
    |         ^^^^^^^^^^^^^^^^^^^^^
+help: use `let _ = ...` to ignore the expression or result
+   |
+LL -     forget(s1);
+LL +     let _ = s1;
+   |
 
 warning: calls to `std::mem::forget` with a value that implements `Copy` does nothing
   --> $DIR/forgetting_copy_types.rs:35:5
@@ -21,7 +25,11 @@ LL |     forget(s2);
    |            |
    |            argument has type `SomeStruct`
    |
-   = note: use `let _ = ...` to ignore the expression or result
+help: use `let _ = ...` to ignore the expression or result
+   |
+LL -     forget(s2);
+LL +     let _ = s2;
+   |
 
 warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
   --> $DIR/forgetting_copy_types.rs:36:5
@@ -42,7 +50,11 @@ LL |     forget(s4);
    |            |
    |            argument has type `SomeStruct`
    |
-   = note: use `let _ = ...` to ignore the expression or result
+help: use `let _ = ...` to ignore the expression or result
+   |
+LL -     forget(s4);
+LL +     let _ = s4;
+   |
 
 warning: calls to `std::mem::forget` with a reference instead of an owned value does nothing
   --> $DIR/forgetting_copy_types.rs:38:5