diff --git a/compiler/rustc_lint/messages.ftl b/compiler/rustc_lint/messages.ftl
index e323570b5bc..a5639404faf 100644
--- a/compiler/rustc_lint/messages.ftl
+++ b/compiler/rustc_lint/messages.ftl
@@ -523,12 +523,16 @@ lint_opaque_hidden_inferred_bound_sugg = add this bound
 
 lint_drop_ref = calls to `std::mem::drop` 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
 
 lint_drop_copy = calls to `std::mem::drop` with a value that implements `Copy` does nothing
     .label = argument has type `{$arg_ty}`
+    .note = use `let _ = ...` to ignore the expression or result
 
 lint_forget_ref = 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
 
 lint_forget_copy = 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
diff --git a/compiler/rustc_lint/src/lints.rs b/compiler/rustc_lint/src/lints.rs
index 755b907dfe5..8e48806b504 100644
--- a/compiler/rustc_lint/src/lints.rs
+++ b/compiler/rustc_lint/src/lints.rs
@@ -665,6 +665,7 @@ pub struct ForLoopsOverFalliblesSuggestion<'a> {
 // drop_ref.rs
 #[derive(LintDiagnostic)]
 #[diag(lint_drop_ref)]
+#[note]
 pub struct DropRefDiag<'a> {
     pub arg_ty: Ty<'a>,
     #[label]
@@ -673,6 +674,7 @@ pub struct DropRefDiag<'a> {
 
 #[derive(LintDiagnostic)]
 #[diag(lint_drop_copy)]
+#[note]
 pub struct DropCopyDiag<'a> {
     pub arg_ty: Ty<'a>,
     #[label]
@@ -681,6 +683,7 @@ pub struct DropCopyDiag<'a> {
 
 #[derive(LintDiagnostic)]
 #[diag(lint_forget_ref)]
+#[note]
 pub struct ForgetRefDiag<'a> {
     pub arg_ty: Ty<'a>,
     #[label]
@@ -689,6 +692,7 @@ pub struct ForgetRefDiag<'a> {
 
 #[derive(LintDiagnostic)]
 #[diag(lint_forget_copy)]
+#[note]
 pub struct ForgetCopyDiag<'a> {
     pub arg_ty: Ty<'a>,
     #[label]
diff --git a/tests/ui/lint/drop_copy.stderr b/tests/ui/lint/drop_copy.stderr
index 2f122ad2aaa..db8e89ad295 100644
--- a/tests/ui/lint/drop_copy.stderr
+++ b/tests/ui/lint/drop_copy.stderr
@@ -6,6 +6,7 @@ LL |     drop(s1);
    |          |
    |          argument has type `SomeStruct`
    |
+   = note: use `let _ = ...` to ignore the expression or result
 note: the lint level is defined here
   --> $DIR/drop_copy.rs:3:9
    |
@@ -19,6 +20,8 @@ LL |     drop(s2);
    |     ^^^^^--^
    |          |
    |          argument has type `SomeStruct`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
   --> $DIR/drop_copy.rs:36:5
@@ -28,6 +31,7 @@ LL |     drop(s3);
    |          |
    |          argument has type `&SomeStruct`
    |
+   = note: use `let _ = ...` to ignore the expression or result
    = note: `#[warn(drop_ref)]` on by default
 
 warning: calls to `std::mem::drop` with a value that implements `Copy` does nothing
@@ -37,6 +41,8 @@ LL |     drop(s4);
    |     ^^^^^--^
    |          |
    |          argument has type `SomeStruct`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
   --> $DIR/drop_copy.rs:38:5
@@ -45,6 +51,8 @@ LL |     drop(s5);
    |     ^^^^^--^
    |          |
    |          argument has type `&SomeStruct`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
   --> $DIR/drop_copy.rs:50:5
@@ -53,6 +61,8 @@ LL |     drop(a2);
    |     ^^^^^--^
    |          |
    |          argument has type `&AnotherStruct`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
   --> $DIR/drop_copy.rs:52:5
@@ -61,6 +71,8 @@ LL |     drop(a4);
    |     ^^^^^--^
    |          |
    |          argument has type `&AnotherStruct`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: calls to `std::mem::drop` with a value that implements `Copy` does nothing
   --> $DIR/drop_copy.rs:71:13
@@ -69,6 +81,8 @@ LL |             drop(println_and(13));
    |             ^^^^^---------------^
    |                  |
    |                  argument has type `i32`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: calls to `std::mem::drop` with a value that implements `Copy` does nothing
   --> $DIR/drop_copy.rs:74:14
@@ -77,6 +91,8 @@ LL |         3 if drop(println_and(14)) == () => (),
    |              ^^^^^---------------^
    |                   |
    |                   argument has type `i32`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: calls to `std::mem::drop` with a value that implements `Copy` does nothing
   --> $DIR/drop_copy.rs:76:14
@@ -85,6 +101,8 @@ LL |         4 => drop(2),
    |              ^^^^^-^
    |                   |
    |                   argument has type `i32`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: 10 warnings emitted
 
diff --git a/tests/ui/lint/drop_ref.stderr b/tests/ui/lint/drop_ref.stderr
index cd81f72d6e9..04c988fe99d 100644
--- a/tests/ui/lint/drop_ref.stderr
+++ b/tests/ui/lint/drop_ref.stderr
@@ -6,6 +6,7 @@ LL |     drop(&SomeStruct);
    |          |
    |          argument has type `&SomeStruct`
    |
+   = note: use `let _ = ...` to ignore the expression or result
 note: the lint level is defined here
   --> $DIR/drop_ref.rs:3:9
    |
@@ -19,6 +20,8 @@ LL |     drop(&owned1);
    |     ^^^^^-------^
    |          |
    |          argument has type `&SomeStruct`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
   --> $DIR/drop_ref.rs:12:5
@@ -27,6 +30,8 @@ LL |     drop(&&owned1);
    |     ^^^^^--------^
    |          |
    |          argument has type `&&SomeStruct`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
   --> $DIR/drop_ref.rs:13:5
@@ -35,6 +40,8 @@ LL |     drop(&mut owned1);
    |     ^^^^^-----------^
    |          |
    |          argument has type `&mut SomeStruct`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
   --> $DIR/drop_ref.rs:17:5
@@ -43,6 +50,8 @@ LL |     drop(reference1);
    |     ^^^^^----------^
    |          |
    |          argument has type `&SomeStruct`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
   --> $DIR/drop_ref.rs:20:5
@@ -51,6 +60,8 @@ LL |     drop(reference2);
    |     ^^^^^----------^
    |          |
    |          argument has type `&mut SomeStruct`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
   --> $DIR/drop_ref.rs:23:5
@@ -59,6 +70,8 @@ LL |     drop(reference3);
    |     ^^^^^----------^
    |          |
    |          argument has type `&SomeStruct`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
   --> $DIR/drop_ref.rs:28:5
@@ -67,6 +80,8 @@ LL |     drop(&val);
    |     ^^^^^----^
    |          |
    |          argument has type `&T`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
   --> $DIR/drop_ref.rs:36:5
@@ -75,6 +90,8 @@ LL |     std::mem::drop(&SomeStruct);
    |     ^^^^^^^^^^^^^^^-----------^
    |                    |
    |                    argument has type `&SomeStruct`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
   --> $DIR/drop_ref.rs:91:13
@@ -83,6 +100,8 @@ LL |             drop(println_and(&13));
    |             ^^^^^----------------^
    |                  |
    |                  argument has type `&i32`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
   --> $DIR/drop_ref.rs:94:14
@@ -91,6 +110,8 @@ LL |         3 if drop(println_and(&14)) == () => (),
    |              ^^^^^----------------^
    |                   |
    |                   argument has type `&i32`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: calls to `std::mem::drop` with a reference instead of an owned value does nothing
   --> $DIR/drop_ref.rs:96:14
@@ -99,6 +120,8 @@ LL |         4 => drop(&2),
    |              ^^^^^--^
    |                   |
    |                   argument has type `&i32`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: 12 warnings emitted
 
diff --git a/tests/ui/lint/forget_copy.stderr b/tests/ui/lint/forget_copy.stderr
index b5ce052d379..37bc8a8854e 100644
--- a/tests/ui/lint/forget_copy.stderr
+++ b/tests/ui/lint/forget_copy.stderr
@@ -6,6 +6,7 @@ LL |     forget(s1);
    |            |
    |            argument has type `SomeStruct`
    |
+   = note: use `let _ = ...` to ignore the expression or result
 note: the lint level is defined here
   --> $DIR/forget_copy.rs:3:9
    |
@@ -19,6 +20,8 @@ LL |     forget(s2);
    |     ^^^^^^^--^
    |            |
    |            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/forget_copy.rs:36:5
@@ -28,6 +31,7 @@ LL |     forget(s3);
    |            |
    |            argument has type `&SomeStruct`
    |
+   = note: use `let _ = ...` to ignore the expression or result
    = note: `#[warn(forget_ref)]` on by default
 
 warning: calls to `std::mem::forget` with a value that implements `Copy` does nothing
@@ -37,6 +41,8 @@ LL |     forget(s4);
    |     ^^^^^^^--^
    |            |
    |            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/forget_copy.rs:38:5
@@ -45,6 +51,8 @@ LL |     forget(s5);
    |     ^^^^^^^--^
    |            |
    |            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/forget_copy.rs:50:5
@@ -53,6 +61,8 @@ LL |     forget(a2);
    |     ^^^^^^^--^
    |            |
    |            argument has type `&AnotherStruct`
+   |
+   = 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/forget_copy.rs:52:5
@@ -61,6 +71,8 @@ LL |     forget(a3);
    |     ^^^^^^^--^
    |            |
    |            argument has type `&AnotherStruct`
+   |
+   = 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/forget_copy.rs:53:5
@@ -69,6 +81,8 @@ LL |     forget(a4);
    |     ^^^^^^^--^
    |            |
    |            argument has type `&AnotherStruct`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: 8 warnings emitted
 
diff --git a/tests/ui/lint/forget_ref.stderr b/tests/ui/lint/forget_ref.stderr
index f20f5f54b25..63fc7791980 100644
--- a/tests/ui/lint/forget_ref.stderr
+++ b/tests/ui/lint/forget_ref.stderr
@@ -6,6 +6,7 @@ LL |     forget(&SomeStruct);
    |            |
    |            argument has type `&SomeStruct`
    |
+   = note: use `let _ = ...` to ignore the expression or result
 note: the lint level is defined here
   --> $DIR/forget_ref.rs:3:9
    |
@@ -19,6 +20,8 @@ LL |     forget(&owned);
    |     ^^^^^^^------^
    |            |
    |            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/forget_ref.rs:14:5
@@ -27,6 +30,8 @@ LL |     forget(&&owned);
    |     ^^^^^^^-------^
    |            |
    |            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/forget_ref.rs:15:5
@@ -35,6 +40,8 @@ LL |     forget(&mut owned);
    |     ^^^^^^^----------^
    |            |
    |            argument has type `&mut 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/forget_ref.rs:19:5
@@ -43,6 +50,8 @@ LL |     forget(&*reference1);
    |     ^^^^^^^------------^
    |            |
    |            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/forget_ref.rs:22:5
@@ -51,6 +60,8 @@ LL |     forget(reference2);
    |     ^^^^^^^----------^
    |            |
    |            argument has type `&mut 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/forget_ref.rs:25:5
@@ -59,6 +70,8 @@ LL |     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/forget_ref.rs:30:5
@@ -67,6 +80,8 @@ LL |     forget(&val);
    |     ^^^^^^^----^
    |            |
    |            argument has type `&T`
+   |
+   = 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/forget_ref.rs:38:5
@@ -75,6 +90,8 @@ LL |     std::mem::forget(&SomeStruct);
    |     ^^^^^^^^^^^^^^^^^-----------^
    |                      |
    |                      argument has type `&SomeStruct`
+   |
+   = note: use `let _ = ...` to ignore the expression or result
 
 warning: 9 warnings emitted