Auto merge of #87026 - FabianWolff:issue-86948, r=estebank
Allow labeled loops as value expressions for `break` Fixes #86948. This is currently allowed: ```rust return 'label: loop { break 'label 42; }; break ('label: loop { break 'label 42; }); break 1 + 'label: loop { break 'label 42; }; break 'outer 'inner: loop { break 'inner 42; }; ``` But not this: ```rust break 'label: loop { break 'label 42; }; ``` I have fixed this, so that the above now parses as an unlabeled break with a labeled loop as its value expression.
This commit is contained in:
commit
49ca3d9796
6 changed files with 157 additions and 21 deletions
|
|
@ -1,13 +1,39 @@
|
|||
#![allow(unused, dead_code)]
|
||||
|
||||
fn foo() -> u32 {
|
||||
return 'label: loop { break 'label 42; };
|
||||
}
|
||||
|
||||
fn bar() -> u32 {
|
||||
loop { break 'label: loop { break 'label 42; }; }
|
||||
//~^ ERROR expected identifier, found keyword `loop`
|
||||
//~| ERROR expected type, found keyword `loop`
|
||||
//~^ ERROR: parentheses are required around this expression to avoid confusion
|
||||
//~| HELP: wrap the expression in parentheses
|
||||
}
|
||||
|
||||
fn baz() -> u32 {
|
||||
'label: loop {
|
||||
break 'label
|
||||
//~^ WARNING: this labeled break expression is easy to confuse with an unlabeled break
|
||||
loop { break 42; };
|
||||
//~^ HELP: wrap this expression in parentheses
|
||||
};
|
||||
|
||||
'label2: loop {
|
||||
break 'label2 'inner: loop { break 42; };
|
||||
// no warnings or errors here
|
||||
}
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
foo();
|
||||
// Regression test for issue #86948, as resolved in #87026:
|
||||
let a = 'first_loop: loop {
|
||||
break 'first_loop 1;
|
||||
};
|
||||
let b = loop {
|
||||
break 'inner_loop: loop {
|
||||
//~^ ERROR: parentheses are required around this expression to avoid confusion
|
||||
//~| HELP: wrap the expression in parentheses
|
||||
break 'inner_loop 1;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,23 +1,47 @@
|
|||
error: expected identifier, found keyword `loop`
|
||||
--> $DIR/lifetime_starts_expressions.rs:6:26
|
||||
error: parentheses are required around this expression to avoid confusion with a labeled break expression
|
||||
--> $DIR/lifetime_starts_expressions.rs:8:18
|
||||
|
|
||||
LL | loop { break 'label: loop { break 'label 42; }; }
|
||||
| ^^^^ expected identifier, found keyword
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
help: you can escape reserved keywords to use them as identifiers
|
||||
help: wrap the expression in parentheses
|
||||
|
|
||||
LL | loop { break 'label: r#loop { break 'label 42; }; }
|
||||
| ^^^^^^
|
||||
LL | loop { break ('label: loop { break 'label 42; }); }
|
||||
| ^ ^
|
||||
|
||||
error: expected type, found keyword `loop`
|
||||
--> $DIR/lifetime_starts_expressions.rs:6:26
|
||||
error: parentheses are required around this expression to avoid confusion with a labeled break expression
|
||||
--> $DIR/lifetime_starts_expressions.rs:33:15
|
||||
|
|
||||
LL | loop { break 'label: loop { break 'label 42; }; }
|
||||
| - ^^^^ expected type
|
||||
| |
|
||||
| help: maybe write a path separator here: `::`
|
||||
LL | break 'inner_loop: loop {
|
||||
| _______________^
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | break 'inner_loop 1;
|
||||
LL | | };
|
||||
| |_________^
|
||||
|
|
||||
help: wrap the expression in parentheses
|
||||
|
|
||||
LL | break ('inner_loop: loop {
|
||||
LL |
|
||||
LL |
|
||||
LL | break 'inner_loop 1;
|
||||
LL | });
|
||||
|
|
||||
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
warning: this labeled break expression is easy to confuse with an unlabeled break with a labeled value expression
|
||||
--> $DIR/lifetime_starts_expressions.rs:15:9
|
||||
|
|
||||
LL | / break 'label
|
||||
LL | |
|
||||
LL | | loop { break 42; };
|
||||
| |______________________________^
|
||||
|
|
||||
= note: `#[warn(break_with_label_and_loop)]` on by default
|
||||
help: wrap this expression in parentheses
|
||||
|
|
||||
LL | (loop { break 42; });
|
||||
| ^ ^
|
||||
|
||||
error: aborting due to 2 previous errors; 1 warning emitted
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue