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.
This commit is contained in:
Aaron Kofsky 2022-08-04 17:00:48 -04:00
parent a9095ff213
commit a9f1b7bd2a
2 changed files with 15 additions and 4 deletions

View File

@ -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,

View File

@ -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