diff options
| author | Esteban Küber <esteban@kuber.com.ar> | 2021-01-21 18:13:05 -0800 |
|---|---|---|
| committer | Esteban Küber <esteban@kuber.com.ar> | 2021-01-21 21:43:29 -0800 |
| commit | 9e82329c8f621e59833f4e2d747acdd83b188054 (patch) | |
| tree | 049d4c96179a887e3120369eb5d67ba357a31200 | |
| parent | 76988077700f222791c480e811a709766b099875 (diff) | |
| download | rust-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.rs | 17 | ||||
| -rw-r--r-- | src/test/ui/loops/loop-break-value.stderr | 24 |
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 |
