From a9f1b7bd2a25e34de29eb88f81550690f4fec5dc Mon Sep 17 00:00:00 2001 From: Aaron Kofsky Date: Thu, 4 Aug 2022 17:00:48 -0400 Subject: [PATCH] Explain why let-underscoring a lock guard is incorrect. Currently, the let_underscore_lock lint simply tells what is wrong, but not why it is wrong. We fix this by using a `MultiSpan` to explain specifically that doing `let _ = ` immediately drops the lock guard because it does not assign the lock guard to a binding. --- compiler/rustc_lint/src/let_underscore.rs | 13 +++++++++++-- .../lint/let_underscore/let_underscore_lock.stderr | 6 ++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/compiler/rustc_lint/src/let_underscore.rs b/compiler/rustc_lint/src/let_underscore.rs index 2ba79aacace..79d1443dc35 100644 --- a/compiler/rustc_lint/src/let_underscore.rs +++ b/compiler/rustc_lint/src/let_underscore.rs @@ -1,5 +1,5 @@ use crate::{LateContext, LateLintPass, LintContext}; -use rustc_errors::Applicability; +use rustc_errors::{Applicability, MultiSpan}; use rustc_hir as hir; use rustc_middle::{lint::LintDiagnosticBuilder, ty}; use rustc_span::Symbol; @@ -119,7 +119,16 @@ fn check_local(&mut self, cx: &LateContext<'_>, local: &hir::Local<'_>) { }; if is_sync_lock { - cx.struct_span_lint(LET_UNDERSCORE_LOCK, local.span, |lint| { + let mut span = MultiSpan::from_spans(vec![local.pat.span, init.span]); + span.push_span_label( + local.pat.span, + "this lock is not assigned to a binding and is immediately dropped".to_string(), + ); + span.push_span_label( + init.span, + "this binding will immediately drop the value assigned to it".to_string(), + ); + cx.struct_span_lint(LET_UNDERSCORE_LOCK, span, |lint| { build_and_emit_lint( lint, local, diff --git a/src/test/ui/lint/let_underscore/let_underscore_lock.stderr b/src/test/ui/lint/let_underscore/let_underscore_lock.stderr index 7aa119003b4..fb58af0a42f 100644 --- a/src/test/ui/lint/let_underscore/let_underscore_lock.stderr +++ b/src/test/ui/lint/let_underscore/let_underscore_lock.stderr @@ -1,8 +1,10 @@ error: non-binding let on a synchronization lock - --> $DIR/let_underscore_lock.rs:6:5 + --> $DIR/let_underscore_lock.rs:6:9 | LL | let _ = data.lock().unwrap(); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^ ^^^^^^^^^^^^^^^^^^^^ this binding will immediately drop the value assigned to it + | | + | this lock is not assigned to a binding and is immediately dropped | = note: `#[deny(let_underscore_lock)]` on by default help: consider binding to an unused variable to avoid immediately dropping the value