summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_passes/src/liveness.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
commitef24de24a82fe681581cc130f342363c47c0969a (patch)
tree0d494f7e1a38b95c92426f58fe6eaa877303a86c /compiler/rustc_passes/src/liveness.rs
parentReleasing progress-linux version 1.74.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-ef24de24a82fe681581cc130f342363c47c0969a.tar.xz
rustc-ef24de24a82fe681581cc130f342363c47c0969a.zip
Merging upstream version 1.75.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'compiler/rustc_passes/src/liveness.rs')
-rw-r--r--compiler/rustc_passes/src/liveness.rs62
1 files changed, 40 insertions, 22 deletions
diff --git a/compiler/rustc_passes/src/liveness.rs b/compiler/rustc_passes/src/liveness.rs
index 20e996eae..b73fb984c 100644
--- a/compiler/rustc_passes/src/liveness.rs
+++ b/compiler/rustc_passes/src/liveness.rs
@@ -706,7 +706,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
//
// When computing the liveness for captured variables we take into
// account how variable is captured (ByRef vs ByValue) and what is the
- // closure kind (Generator / FnOnce vs Fn / FnMut).
+ // closure kind (Coroutine / FnOnce vs Fn / FnMut).
//
// Variables captured by reference are assumed to be used on the exit
// from the closure.
@@ -752,7 +752,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
ty::ClosureKind::FnMut => {}
ty::ClosureKind::FnOnce => return succ,
},
- ty::Generator(..) => return succ,
+ ty::Coroutine(..) => return succ,
_ => {
span_bug!(
body.value.span,
@@ -1512,13 +1512,15 @@ impl<'tcx> Liveness<'_, 'tcx> {
Some(body),
|spans, hir_id, ln, var| {
if !self.live_on_entry(ln, var)
- && let Some(name) = self.should_warn(var) {
- self.ir.tcx.emit_spanned_lint(
- lint::builtin::UNUSED_ASSIGNMENTS,
- hir_id,
- spans,
- errors::UnusedAssignPassed { name },
- ); }
+ && let Some(name) = self.should_warn(var)
+ {
+ self.ir.tcx.emit_spanned_lint(
+ lint::builtin::UNUSED_ASSIGNMENTS,
+ hir_id,
+ spans,
+ errors::UnusedAssignPassed { name },
+ );
+ }
},
);
}
@@ -1578,7 +1580,6 @@ impl<'tcx> Liveness<'_, 'tcx> {
opt_body: Option<&hir::Body<'_>>,
) {
let first_hir_id = hir_ids_and_spans[0].0;
-
if let Some(name) = self.should_warn(var).filter(|name| name != "self") {
// annoying: for parameters in funcs like `fn(x: i32)
// {ret}`, there is only one node, so asking about
@@ -1650,11 +1651,29 @@ impl<'tcx> Liveness<'_, 'tcx> {
},
);
} else {
+ // #117284, when `pat_span` and `ident_span` have different contexts
+ // we can't provide a good suggestion, instead we pointed out the spans from macro
+ let from_macro = non_shorthands
+ .iter()
+ .find(|(_, pat_span, ident_span)| {
+ pat_span.ctxt() != ident_span.ctxt() && pat_span.from_expansion()
+ })
+ .map(|(_, pat_span, _)| *pat_span);
let non_shorthands = non_shorthands
.into_iter()
.map(|(_, _, ident_span)| ident_span)
.collect::<Vec<_>>();
+
let suggestions = self.string_interp_suggestions(&name, opt_body);
+ let sugg = if let Some(span) = from_macro {
+ errors::UnusedVariableSugg::NoSugg { span, name: name.clone() }
+ } else {
+ errors::UnusedVariableSugg::TryPrefixSugg {
+ spans: non_shorthands,
+ name: name.clone(),
+ }
+ };
+
self.ir.tcx.emit_spanned_lint(
lint::builtin::UNUSED_VARIABLES,
first_hir_id,
@@ -1664,10 +1683,8 @@ impl<'tcx> Liveness<'_, 'tcx> {
.collect::<Vec<_>>(),
errors::UnusedVariableTryPrefix {
label: if !suggestions.is_empty() { Some(pat.span) } else { None },
- sugg: errors::UnusedVariableTryPrefixSugg {
- spans: non_shorthands,
- name,
- },
+ name,
+ sugg,
string_interp: suggestions,
},
);
@@ -1707,13 +1724,14 @@ impl<'tcx> Liveness<'_, 'tcx> {
fn warn_about_dead_assign(&self, spans: Vec<Span>, hir_id: HirId, ln: LiveNode, var: Variable) {
if !self.live_on_exit(ln, var)
- && let Some(name) = self.should_warn(var) {
- self.ir.tcx.emit_spanned_lint(
- lint::builtin::UNUSED_ASSIGNMENTS,
- hir_id,
- spans,
- errors::UnusedAssign { name },
- );
- }
+ && let Some(name) = self.should_warn(var)
+ {
+ self.ir.tcx.emit_spanned_lint(
+ lint::builtin::UNUSED_ASSIGNMENTS,
+ hir_id,
+ spans,
+ errors::UnusedAssign { name },
+ );
+ }
}
}