diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 1934f800af757..0c37296d2411b 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -357,7 +357,12 @@ fn resolve_struct_error<'sess, 'a>(resolver: &'sess Resolver<'_>, "use of undeclared label `{}`", name); if let Some(lev_candidate) = lev_candidate { - err.span_label(span, format!("did you mean `{}`?", lev_candidate)); + err.span_suggestion( + span, + "a label with a similar name exists in this scope", + lev_candidate.to_string(), + Applicability::MaybeIncorrect, + ); } else { err.span_label(span, format!("undeclared label `{}`", name)); } @@ -4218,7 +4223,13 @@ impl<'a> Resolver<'a> { // Picks the first label that is "close enough", which is not necessarily // the closest match let close_match = self.search_label(label.ident, |rib, ident| { - let names = rib.bindings.iter().map(|(id, _)| &id.name); + let names = rib.bindings.iter().filter_map(|(id, _)| { + if id.span.ctxt() == label.ident.span.ctxt() { + Some(&id.name) + } else { + None + } + }); find_best_match_for_name(names, &*ident.as_str(), None) }); self.record_def(expr.id, err_path_resolution()); diff --git a/src/test/ui/hygiene/hygienic-label-1.stderr b/src/test/ui/hygiene/hygienic-label-1.stderr index 80cd1547b45e7..d61c0687c1665 100644 --- a/src/test/ui/hygiene/hygienic-label-1.stderr +++ b/src/test/ui/hygiene/hygienic-label-1.stderr @@ -2,7 +2,7 @@ error[E0426]: use of undeclared label `'x` --> $DIR/hygienic-label-1.rs:2:19 | LL | () => { break 'x; } - | ^^ did you mean `'x`? + | ^^ undeclared label `'x` ... LL | 'x: loop { foo!() } | ------ in this macro invocation diff --git a/src/test/ui/hygiene/hygienic-label-2.stderr b/src/test/ui/hygiene/hygienic-label-2.stderr index c20cbd9f68791..f23e741debe9d 100644 --- a/src/test/ui/hygiene/hygienic-label-2.stderr +++ b/src/test/ui/hygiene/hygienic-label-2.stderr @@ -2,7 +2,7 @@ error[E0426]: use of undeclared label `'x` --> $DIR/hygienic-label-2.rs:6:16 | LL | foo!(break 'x); - | ^^ did you mean `'x`? + | ^^ undeclared label `'x` error: aborting due to previous error diff --git a/src/test/ui/hygiene/hygienic-label-3.stderr b/src/test/ui/hygiene/hygienic-label-3.stderr index b5839fe5c3d23..0c4173a61aac4 100644 --- a/src/test/ui/hygiene/hygienic-label-3.stderr +++ b/src/test/ui/hygiene/hygienic-label-3.stderr @@ -2,7 +2,7 @@ error[E0426]: use of undeclared label `'x` --> $DIR/hygienic-label-3.rs:2:19 | LL | () => { break 'x; } - | ^^ did you mean `'x`? + | ^^ undeclared label `'x` ... LL | foo!() | ------ in this macro invocation diff --git a/src/test/ui/hygiene/hygienic-label-4.stderr b/src/test/ui/hygiene/hygienic-label-4.stderr index 1dd7489574622..1c93da02f6142 100644 --- a/src/test/ui/hygiene/hygienic-label-4.stderr +++ b/src/test/ui/hygiene/hygienic-label-4.stderr @@ -2,7 +2,7 @@ error[E0426]: use of undeclared label `'x` --> $DIR/hygienic-label-4.rs:6:16 | LL | foo!(break 'x); - | ^^ did you mean `'x`? + | ^^ undeclared label `'x` error: aborting due to previous error diff --git a/src/test/ui/suggestions/suggest-labels.stderr b/src/test/ui/suggestions/suggest-labels.stderr index ead8f94209bdc..02d46a3f59607 100644 --- a/src/test/ui/suggestions/suggest-labels.stderr +++ b/src/test/ui/suggestions/suggest-labels.stderr @@ -2,19 +2,31 @@ error[E0426]: use of undeclared label `'fo` --> $DIR/suggest-labels.rs:4:15 | LL | break 'fo; - | ^^^ did you mean `'foo`? + | ^^^ +help: a label with a similar name exists in this scope + | +LL | break 'foo; + | ^^^^ error[E0426]: use of undeclared label `'bor` --> $DIR/suggest-labels.rs:8:18 | LL | continue 'bor; - | ^^^^ did you mean `'bar`? + | ^^^^ +help: a label with a similar name exists in this scope + | +LL | continue 'bar; + | ^^^^ error[E0426]: use of undeclared label `'longlable` --> $DIR/suggest-labels.rs:13:19 | LL | break 'longlable; - | ^^^^^^^^^^ did you mean `'longlabel1`? + | ^^^^^^^^^^ +help: a label with a similar name exists in this scope + | +LL | break 'longlabel1; + | ^^^^^^^^^^^ error: aborting due to 3 previous errors