about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2021-01-21 18:13:05 -0800
committerEsteban Küber <esteban@kuber.com.ar>2021-01-21 21:43:29 -0800
commit9e82329c8f621e59833f4e2d747acdd83b188054 (patch)
tree049d4c96179a887e3120369eb5d67ba357a31200
parent76988077700f222791c480e811a709766b099875 (diff)
downloadrust-9e82329c8f621e59833f4e2d747acdd83b188054.tar.gz
rust-9e82329c8f621e59833f4e2d747acdd83b188054.zip
Do not suggest using a break label when one is already present
-rw-r--r--compiler/rustc_passes/src/loops.rs17
-rw-r--r--src/test/ui/loops/loop-break-value.stderr24
2 files changed, 17 insertions, 24 deletions
diff --git a/compiler/rustc_passes/src/loops.rs b/compiler/rustc_passes/src/loops.rs
index 18b6b98e16a..4bfac1b7298 100644
--- a/compiler/rustc_passes/src/loops.rs
+++ b/compiler/rustc_passes/src/loops.rs
@@ -68,18 +68,18 @@ impl<'a, 'hir> Visitor<'hir> for CheckLoopVisitor<'a, 'hir> {
             hir::ExprKind::Block(ref b, Some(_label)) => {
                 self.with_context(LabeledBlock, |v| v.visit_block(&b));
             }
-            hir::ExprKind::Break(label, ref opt_expr) => {
+            hir::ExprKind::Break(break_label, ref opt_expr) => {
                 if let Some(e) = opt_expr {
                     self.visit_expr(e);
                 }
 
-                if self.require_label_in_labeled_block(e.span, &label, "break") {
+                if self.require_label_in_labeled_block(e.span, &break_label, "break") {
                     // If we emitted an error about an unlabeled break in a labeled
                     // block, we don't need any further checking for this break any more
                     return;
                 }
 
-                let loop_id = match label.target_id {
+                let loop_id = match break_label.target_id {
                     Ok(loop_id) => Some(loop_id),
                     Err(hir::LoopIdError::OutsideLoopScope) => None,
                     Err(hir::LoopIdError::UnlabeledCfInWhileCondition) => {
@@ -94,7 +94,7 @@ impl<'a, 'hir> Visitor<'hir> for CheckLoopVisitor<'a, 'hir> {
                 }
 
                 if let Some(break_expr) = opt_expr {
-                    let (head, label, loop_kind) = if let Some(loop_id) = loop_id {
+                    let (head, loop_label, loop_kind) = if let Some(loop_id) = loop_id {
                         match self.hir_map.expect_expr(loop_id).kind {
                             hir::ExprKind::Loop(_, label, source, sp) => {
                                 (Some(sp), label, Some(source))
@@ -135,10 +135,15 @@ impl<'a, 'hir> Visitor<'hir> for CheckLoopVisitor<'a, 'hir> {
                                     "use `break` on its own without a value inside this `{}` loop",
                                     kind.name(),
                                 ),
-                                "break".to_string(),
+                                format!(
+                                    "break{}",
+                                    break_label
+                                        .label
+                                        .map_or_else(String::new, |l| format!(" {}", l.ident))
+                                ),
                                 Applicability::MaybeIncorrect,
                             );
-                            if let Some(label) = label {
+                            if let (Some(label), None) = (loop_label, break_label.label) {
                                 match break_expr.kind {
                                     hir::ExprKind::Path(hir::QPath::Resolved(
                                         None,
diff --git a/src/test/ui/loops/loop-break-value.stderr b/src/test/ui/loops/loop-break-value.stderr
index c7cf1017d4b..adb099f9b17 100644
--- a/src/test/ui/loops/loop-break-value.stderr
+++ b/src/test/ui/loops/loop-break-value.stderr
@@ -46,12 +46,8 @@ LL |             break 'while_loop 123;
    |
 help: use `break` on its own without a value inside this `while` loop
    |
-LL |             break;
-   |             ^^^^^
-help: alternatively, you might have meant to use the available loop label
-   |
-LL |             break 'while_loop 'while_loop;
-   |                               ^^^^^^^^^^^
+LL |             break 'while_loop;
+   |             ^^^^^^^^^^^^^^^^^
 
 error[E0571]: `break` with value from a `while` loop
   --> $DIR/loop-break-value.rs:38:12
@@ -90,12 +86,8 @@ LL |             break 'while_let_loop "nope";
    |
 help: use `break` on its own without a value inside this `while` loop
    |
-LL |             break;
-   |             ^^^^^
-help: alternatively, you might have meant to use the available loop label
-   |
-LL |             break 'while_let_loop 'while_let_loop;
-   |                                   ^^^^^^^^^^^^^^^
+LL |             break 'while_let_loop;
+   |             ^^^^^^^^^^^^^^^^^^^^^
 
 error[E0571]: `break` with value from a `for` loop
   --> $DIR/loop-break-value.rs:56:9
@@ -135,12 +127,8 @@ LL |             break 'for_loop Some(17);
    |
 help: use `break` on its own without a value inside this `for` loop
    |
-LL |             break;
-   |             ^^^^^
-help: alternatively, you might have meant to use the available loop label
-   |
-LL |             break 'for_loop 'for_loop;
-   |                             ^^^^^^^^^
+LL |             break 'for_loop;
+   |             ^^^^^^^^^^^^^^^
 
 error[E0308]: mismatched types
   --> $DIR/loop-break-value.rs:4:31