Skip to content

Commit f06f051

Browse files
committed
Suggest removing label in 'label: non_block_expr
1 parent c6e5bb3 commit f06f051

File tree

5 files changed

+67
-13
lines changed

5 files changed

+67
-13
lines changed

compiler/rustc_parse/src/parser/expr.rs

+14-3
Original file line numberDiff line numberDiff line change
@@ -1557,6 +1557,8 @@ impl<'a> Parser<'a> {
15571557

15581558
// Continue as an expression in an effort to recover on `'label: non_block_expr`.
15591559
let expr = self.parse_expr().map(|expr| {
1560+
let span = expr.span;
1561+
15601562
let found_labeled_breaks = {
15611563
struct FindLabeledBreaksVisitor(bool);
15621564

@@ -1573,13 +1575,22 @@ impl<'a> Parser<'a> {
15731575
vis.0
15741576
};
15751577

1576-
// Suggestion involves adding a (as of time of writing this, unstable) labeled block
1577-
// so if the label is not used, just return the unmodified expression
1578+
// Suggestion involves adding a (as of time of writing this, unstable) labeled block.
1579+
//
1580+
// If there are no breaks that may use this label, suggest removing the label and
1581+
// recover to the unmodified expression.
15781582
if !found_labeled_breaks {
1583+
let msg = "consider removing the label";
1584+
err.span_suggestion_verbose(
1585+
lo.until(span),
1586+
msg,
1587+
"",
1588+
Applicability::MachineApplicable,
1589+
);
1590+
15791591
return expr;
15801592
}
15811593

1582-
let span = expr.span;
15831594
let sugg_msg = "consider enclosing expression in a block";
15841595
let suggestions = vec![
15851596
(span.shrink_to_lo(), "{".to_owned()),

src/test/ui/parser/labeled-no-colon-expr.stderr

+6
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ error: expected `while`, `for`, `loop` or `{` after a label
4747
|
4848
LL | 'l4 0;
4949
| ^ expected `while`, `for`, `loop` or `{` after a label
50+
|
51+
help: consider removing the label
52+
|
53+
LL - 'l4 0;
54+
LL + 0;
55+
|
5056

5157
error: labeled expression must be followed by `:`
5258
--> $DIR/labeled-no-colon-expr.rs:8:9

src/test/ui/parser/recover-labeled-non-block-expr.fixed

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
// run-rustfix
22
#![feature(label_break_value)]
33
fn main() {
4-
// FIXME(waffle): add this back
5-
// #[allow(unused_labels)]
6-
// 'label: 1 + 1; // ERROR expected `while`, `for`, `loop` or `{` after a label
4+
let _ = 1 + 1; //~ ERROR expected `while`, `for`, `loop` or `{` after a label
75

6+
match () { () => {}, }; //~ ERROR expected `while`, `for`, `loop` or `{` after a label
87
'label: {match () { () => break 'label, }}; //~ ERROR expected `while`, `for`, `loop` or `{` after a label
8+
#[allow(unused_labels)]
9+
'label: {match () { () => 'lp: loop { break 'lp 0 }, }}; //~ ERROR expected `while`, `for`, `loop` or `{` after a label
910

1011
let x = 1;
1112
let _i = 'label: {match x { //~ ERROR expected `while`, `for`, `loop` or `{` after a label

src/test/ui/parser/recover-labeled-non-block-expr.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
// run-rustfix
22
#![feature(label_break_value)]
33
fn main() {
4-
// FIXME(waffle): add this back
5-
// #[allow(unused_labels)]
6-
// 'label: 1 + 1; // ERROR expected `while`, `for`, `loop` or `{` after a label
4+
let _ = 'label: 1 + 1; //~ ERROR expected `while`, `for`, `loop` or `{` after a label
75

6+
'label: match () { () => {}, }; //~ ERROR expected `while`, `for`, `loop` or `{` after a label
87
'label: match () { () => break 'label, }; //~ ERROR expected `while`, `for`, `loop` or `{` after a label
8+
#[allow(unused_labels)]
9+
'label: match () { () => 'lp: loop { break 'lp 0 }, }; //~ ERROR expected `while`, `for`, `loop` or `{` after a label
910

1011
let x = 1;
1112
let _i = 'label: match x { //~ ERROR expected `while`, `for`, `loop` or `{` after a label

src/test/ui/parser/recover-labeled-non-block-expr.stderr

+39-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,29 @@
11
error: expected `while`, `for`, `loop` or `{` after a label
2-
--> $DIR/recover-labeled-non-block-expr.rs:8:13
2+
--> $DIR/recover-labeled-non-block-expr.rs:4:21
3+
|
4+
LL | let _ = 'label: 1 + 1;
5+
| ^ expected `while`, `for`, `loop` or `{` after a label
6+
|
7+
help: consider removing the label
8+
|
9+
LL - let _ = 'label: 1 + 1;
10+
LL + let _ = 1 + 1;
11+
|
12+
13+
error: expected `while`, `for`, `loop` or `{` after a label
14+
--> $DIR/recover-labeled-non-block-expr.rs:6:13
15+
|
16+
LL | 'label: match () { () => {}, };
17+
| ^^^^^ expected `while`, `for`, `loop` or `{` after a label
18+
|
19+
help: consider removing the label
20+
|
21+
LL - 'label: match () { () => {}, };
22+
LL + match () { () => {}, };
23+
|
24+
25+
error: expected `while`, `for`, `loop` or `{` after a label
26+
--> $DIR/recover-labeled-non-block-expr.rs:7:13
327
|
428
LL | 'label: match () { () => break 'label, };
529
| ^^^^^ expected `while`, `for`, `loop` or `{` after a label
@@ -10,7 +34,18 @@ LL | 'label: {match () { () => break 'label, }};
1034
| + +
1135

1236
error: expected `while`, `for`, `loop` or `{` after a label
13-
--> $DIR/recover-labeled-non-block-expr.rs:11:22
37+
--> $DIR/recover-labeled-non-block-expr.rs:9:13
38+
|
39+
LL | 'label: match () { () => 'lp: loop { break 'lp 0 }, };
40+
| ^^^^^ expected `while`, `for`, `loop` or `{` after a label
41+
|
42+
help: consider enclosing expression in a block
43+
|
44+
LL | 'label: {match () { () => 'lp: loop { break 'lp 0 }, }};
45+
| + +
46+
47+
error: expected `while`, `for`, `loop` or `{` after a label
48+
--> $DIR/recover-labeled-non-block-expr.rs:12:22
1449
|
1550
LL | let _i = 'label: match x {
1651
| ^^^^^ expected `while`, `for`, `loop` or `{` after a label
@@ -26,7 +61,7 @@ LL | break 'label 13
2661
...
2762

2863
error: expected `while`, `for`, `loop` or `{` after a label
29-
--> $DIR/recover-labeled-non-block-expr.rs:25:24
64+
--> $DIR/recover-labeled-non-block-expr.rs:26:24
3065
|
3166
LL | let _val = 'label: (1, if other == 3 { break 'label (2, 3) } else { other });
3267
| ^ expected `while`, `for`, `loop` or `{` after a label
@@ -36,5 +71,5 @@ help: consider enclosing expression in a block
3671
LL | let _val = 'label: {(1, if other == 3 { break 'label (2, 3) } else { other })};
3772
| + +
3873

39-
error: aborting due to 3 previous errors
74+
error: aborting due to 6 previous errors
4075

0 commit comments

Comments
 (0)