diff --git a/compiler/rustc_resolve/src/late/diagnostics.rs b/compiler/rustc_resolve/src/late/diagnostics.rs index f8f81c91287..bed7a350ea8 100644 --- a/compiler/rustc_resolve/src/late/diagnostics.rs +++ b/compiler/rustc_resolve/src/late/diagnostics.rs @@ -545,7 +545,7 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> { if let Some(err_code) = &err.code { if err_code == &rustc_errors::error_code!(E0425) { for label_rib in &self.label_ribs { - for (label_ident, _) in &label_rib.bindings { + for (label_ident, node_id) in &label_rib.bindings { if format!("'{}", ident) == label_ident.to_string() { err.span_label(label_ident.span, "a label with a similar name exists"); if let PathSource::Expr(Some(Expr { @@ -559,6 +559,8 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> { label_ident.name.to_string(), Applicability::MaybeIncorrect, ); + // Do not lint against unused label when we suggest them. + self.diagnostic_metadata.unused_labels.remove(node_id); } } } diff --git a/src/test/ui/label/label_misspelled.rs b/src/test/ui/label/label_misspelled.rs index 33619987fef..e3180b06ecb 100644 --- a/src/test/ui/label/label_misspelled.rs +++ b/src/test/ui/label/label_misspelled.rs @@ -25,22 +25,18 @@ fn main() { fn foo() { 'LOOP: loop { - //~^ WARN unused label break LOOP; //~^ ERROR cannot find value `LOOP` in this scope }; 'while_loop: while true { //~ WARN denote infinite loops with - //~^ WARN unused label break while_loop; //~^ ERROR cannot find value `while_loop` in this scope }; 'while_let: while let Some(_) = Some(()) { - //~^ WARN unused label break while_let; //~^ ERROR cannot find value `while_let` in this scope } 'for_loop: for _ in 0..3 { - //~^ WARN unused label break for_loop; //~^ ERROR cannot find value `for_loop` in this scope }; diff --git a/src/test/ui/label/label_misspelled.stderr b/src/test/ui/label/label_misspelled.stderr index 817eac8256f..b09695787a4 100644 --- a/src/test/ui/label/label_misspelled.stderr +++ b/src/test/ui/label/label_misspelled.stderr @@ -35,11 +35,10 @@ LL | LOOP; | ^^^^ not found in this scope error[E0425]: cannot find value `LOOP` in this scope - --> $DIR/label_misspelled.rs:29:15 + --> $DIR/label_misspelled.rs:28:15 | LL | 'LOOP: loop { | ----- a label with a similar name exists -LL | LL | break LOOP; | ^^^^ | | @@ -47,11 +46,10 @@ LL | break LOOP; | help: use the similarly named label: `'LOOP` error[E0425]: cannot find value `while_loop` in this scope - --> $DIR/label_misspelled.rs:34:15 + --> $DIR/label_misspelled.rs:32:15 | LL | 'while_loop: while true { | ----------- a label with a similar name exists -LL | LL | break while_loop; | ^^^^^^^^^^ | | @@ -59,11 +57,10 @@ LL | break while_loop; | help: use the similarly named label: `'while_loop` error[E0425]: cannot find value `while_let` in this scope - --> $DIR/label_misspelled.rs:39:15 + --> $DIR/label_misspelled.rs:36:15 | LL | 'while_let: while let Some(_) = Some(()) { | ---------- a label with a similar name exists -LL | LL | break while_let; | ^^^^^^^^^ | | @@ -71,11 +68,10 @@ LL | break while_let; | help: use the similarly named label: `'while_let` error[E0425]: cannot find value `for_loop` in this scope - --> $DIR/label_misspelled.rs:44:15 + --> $DIR/label_misspelled.rs:40:15 | LL | 'for_loop: for _ in 0..3 { | --------- a label with a similar name exists -LL | LL | break for_loop; | ^^^^^^^^ | | @@ -120,62 +116,38 @@ warning: unused label LL | 'LOOP: loop { | ^^^^^ -warning: unused label - --> $DIR/label_misspelled.rs:27:5 - | -LL | 'LOOP: loop { - | ^^^^^ - -warning: unused label - --> $DIR/label_misspelled.rs:32:5 - | -LL | 'while_loop: while true { - | ^^^^^^^^^^^ - warning: denote infinite loops with `loop { ... }` - --> $DIR/label_misspelled.rs:32:5 + --> $DIR/label_misspelled.rs:31:5 | LL | 'while_loop: while true { | ^^^^^^^^^^^^^^^^^^^^^^^ help: use `loop` warning: unused label - --> $DIR/label_misspelled.rs:37:5 - | -LL | 'while_let: while let Some(_) = Some(()) { - | ^^^^^^^^^^ - -warning: unused label - --> $DIR/label_misspelled.rs:42:5 - | -LL | 'for_loop: for _ in 0..3 { - | ^^^^^^^^^ - -warning: unused label - --> $DIR/label_misspelled.rs:51:5 + --> $DIR/label_misspelled.rs:47:5 | LL | 'while_loop: while true { | ^^^^^^^^^^^ warning: denote infinite loops with `loop { ... }` - --> $DIR/label_misspelled.rs:51:5 + --> $DIR/label_misspelled.rs:47:5 | LL | 'while_loop: while true { | ^^^^^^^^^^^^^^^^^^^^^^^ help: use `loop` warning: unused label - --> $DIR/label_misspelled.rs:56:5 + --> $DIR/label_misspelled.rs:52:5 | LL | 'while_let: while let Some(_) = Some(()) { | ^^^^^^^^^^ warning: unused label - --> $DIR/label_misspelled.rs:61:5 + --> $DIR/label_misspelled.rs:57:5 | LL | 'for_loop: for _ in 0..3 { | ^^^^^^^^^ error[E0571]: `break` with value from a `while` loop - --> $DIR/label_misspelled.rs:53:9 + --> $DIR/label_misspelled.rs:49:9 | LL | 'while_loop: while true { | ----------------------- you can't `break` with a value in a `while` loop @@ -193,7 +165,7 @@ LL | break 'while_loop; | ^^^^^^^^^^^ error[E0571]: `break` with value from a `while` loop - --> $DIR/label_misspelled.rs:58:9 + --> $DIR/label_misspelled.rs:54:9 | LL | 'while_let: while let Some(_) = Some(()) { | ---------------------------------------- you can't `break` with a value in a `while` loop @@ -211,7 +183,7 @@ LL | break 'while_let; | ^^^^^^^^^^ error[E0571]: `break` with value from a `for` loop - --> $DIR/label_misspelled.rs:63:9 + --> $DIR/label_misspelled.rs:59:9 | LL | 'for_loop: for _ in 0..3 { | ------------------------ you can't `break` with a value in a `for` loop @@ -228,7 +200,7 @@ help: alternatively, you might have meant to use the available loop label LL | break 'for_loop; | ^^^^^^^^^ -error: aborting due to 11 previous errors; 14 warnings emitted +error: aborting due to 11 previous errors; 10 warnings emitted Some errors have detailed explanations: E0425, E0571. For more information about an error, try `rustc --explain E0425`. diff --git a/src/test/ui/label/label_misspelled_2.rs b/src/test/ui/label/label_misspelled_2.rs index 7fa101dbdf8..28bfe6f26cf 100644 --- a/src/test/ui/label/label_misspelled_2.rs +++ b/src/test/ui/label/label_misspelled_2.rs @@ -5,7 +5,6 @@ fn main() { break 'a; } 'b: for _ in 0..1 { - //~^ WARN unused label break b; //~ ERROR cannot find value `b` in this scope } c: for _ in 0..1 { //~ ERROR expected identifier, found keyword `for` diff --git a/src/test/ui/label/label_misspelled_2.stderr b/src/test/ui/label/label_misspelled_2.stderr index b56896a77ed..c1921b95274 100644 --- a/src/test/ui/label/label_misspelled_2.stderr +++ b/src/test/ui/label/label_misspelled_2.stderr @@ -1,11 +1,11 @@ error: expected identifier, found keyword `for` - --> $DIR/label_misspelled_2.rs:11:8 + --> $DIR/label_misspelled_2.rs:10:8 | LL | c: for _ in 0..1 { | ^^^ expected identifier, found keyword error: expected `<`, found reserved identifier `_` - --> $DIR/label_misspelled_2.rs:11:12 + --> $DIR/label_misspelled_2.rs:10:12 | LL | c: for _ in 0..1 { | - ^ expected `<` @@ -16,29 +16,16 @@ LL | c: for _ in 0..1 { = note: see issue #23416 for more information error[E0425]: cannot find value `b` in this scope - --> $DIR/label_misspelled_2.rs:9:15 + --> $DIR/label_misspelled_2.rs:8:15 | LL | 'b: for _ in 0..1 { | -- a label with a similar name exists -LL | LL | break b; | ^ | | | not found in this scope | help: use the similarly named label: `'b` -warning: unused label - --> $DIR/label_misspelled_2.rs:7:5 - | -LL | 'b: for _ in 0..1 { - | ^^ - | -note: the lint level is defined here - --> $DIR/label_misspelled_2.rs:1:9 - | -LL | #![warn(unused_labels)] - | ^^^^^^^^^^^^^ - -error: aborting due to 3 previous errors; 1 warning emitted +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0425`.