Rollup merge of #103986 - compiler-errors:oh-no-bad-block-should-not-have-label, r=lcnr
Don't silently eat label before block in block-like expr Fixes #103983 cc #92823 (where the regression was introduced)
This commit is contained in:
commit
170ad4a0ab
3 changed files with 227 additions and 4 deletions
|
@ -2468,11 +2468,15 @@ impl<'a> Parser<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn maybe_recover_unexpected_block_label(&mut self) -> bool {
|
pub(crate) fn maybe_recover_unexpected_block_label(&mut self) -> bool {
|
||||||
let Some(label) = self.eat_label().filter(|_| {
|
// Check for `'a : {`
|
||||||
self.eat(&token::Colon) && self.token.kind == token::OpenDelim(Delimiter::Brace)
|
if !(self.check_lifetime()
|
||||||
}) else {
|
&& self.look_ahead(1, |tok| tok.kind == token::Colon)
|
||||||
|
&& self.look_ahead(2, |tok| tok.kind == token::OpenDelim(Delimiter::Brace)))
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
};
|
}
|
||||||
|
let label = self.eat_label().expect("just checked if a label exists");
|
||||||
|
self.bump(); // eat `:`
|
||||||
let span = label.ident.span.to(self.prev_token.span);
|
let span = label.ident.span.to(self.prev_token.span);
|
||||||
let mut err = self.struct_span_err(span, "block label not supported here");
|
let mut err = self.struct_span_err(span, "block label not supported here");
|
||||||
err.span_label(span, "not supported here");
|
err.span_label(span, "not supported here");
|
||||||
|
|
43
src/test/ui/parser/label-after-block-like.rs
Normal file
43
src/test/ui/parser/label-after-block-like.rs
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
fn a() {
|
||||||
|
if let () = () 'a {}
|
||||||
|
//~^ ERROR labeled expression must be followed by `:`
|
||||||
|
//~| ERROR expected `{`, found `'a`
|
||||||
|
}
|
||||||
|
|
||||||
|
fn b() {
|
||||||
|
if true 'a {}
|
||||||
|
//~^ ERROR labeled expression must be followed by `:`
|
||||||
|
//~| ERROR expected `{`, found `'a`
|
||||||
|
}
|
||||||
|
|
||||||
|
fn c() {
|
||||||
|
loop 'a {}
|
||||||
|
//~^ ERROR labeled expression must be followed by `:`
|
||||||
|
//~| ERROR expected `{`, found `'a`
|
||||||
|
}
|
||||||
|
|
||||||
|
fn d() {
|
||||||
|
while true 'a {}
|
||||||
|
//~^ ERROR labeled expression must be followed by `:`
|
||||||
|
//~| ERROR expected `{`, found `'a`
|
||||||
|
}
|
||||||
|
|
||||||
|
fn e() {
|
||||||
|
while let () = () 'a {}
|
||||||
|
//~^ ERROR labeled expression must be followed by `:`
|
||||||
|
//~| ERROR expected `{`, found `'a`
|
||||||
|
}
|
||||||
|
|
||||||
|
fn f() {
|
||||||
|
for _ in 0..0 'a {}
|
||||||
|
//~^ ERROR labeled expression must be followed by `:`
|
||||||
|
//~| ERROR expected `{`, found `'a`
|
||||||
|
}
|
||||||
|
|
||||||
|
fn g() {
|
||||||
|
unsafe 'a {}
|
||||||
|
//~^ ERROR labeled expression must be followed by `:`
|
||||||
|
//~| ERROR expected `{`, found `'a`
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
176
src/test/ui/parser/label-after-block-like.stderr
Normal file
176
src/test/ui/parser/label-after-block-like.stderr
Normal file
|
@ -0,0 +1,176 @@
|
||||||
|
error: labeled expression must be followed by `:`
|
||||||
|
--> $DIR/label-after-block-like.rs:2:20
|
||||||
|
|
|
||||||
|
LL | if let () = () 'a {}
|
||||||
|
| ---^^
|
||||||
|
| | |
|
||||||
|
| | help: add `:` after the label
|
||||||
|
| the label
|
||||||
|
|
|
||||||
|
= note: labels are used before loops and blocks, allowing e.g., `break 'label` to them
|
||||||
|
|
||||||
|
error: expected `{`, found `'a`
|
||||||
|
--> $DIR/label-after-block-like.rs:2:20
|
||||||
|
|
|
||||||
|
LL | if let () = () 'a {}
|
||||||
|
| ^^ expected `{`
|
||||||
|
|
|
||||||
|
note: the `if` expression is missing a block after this condition
|
||||||
|
--> $DIR/label-after-block-like.rs:2:8
|
||||||
|
|
|
||||||
|
LL | if let () = () 'a {}
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
help: try placing this code inside a block
|
||||||
|
|
|
||||||
|
LL | if let () = () { 'a {} }
|
||||||
|
| + +
|
||||||
|
|
||||||
|
error: labeled expression must be followed by `:`
|
||||||
|
--> $DIR/label-after-block-like.rs:8:13
|
||||||
|
|
|
||||||
|
LL | if true 'a {}
|
||||||
|
| ---^^
|
||||||
|
| | |
|
||||||
|
| | help: add `:` after the label
|
||||||
|
| the label
|
||||||
|
|
|
||||||
|
= note: labels are used before loops and blocks, allowing e.g., `break 'label` to them
|
||||||
|
|
||||||
|
error: expected `{`, found `'a`
|
||||||
|
--> $DIR/label-after-block-like.rs:8:13
|
||||||
|
|
|
||||||
|
LL | if true 'a {}
|
||||||
|
| ^^ expected `{`
|
||||||
|
|
|
||||||
|
note: the `if` expression is missing a block after this condition
|
||||||
|
--> $DIR/label-after-block-like.rs:8:8
|
||||||
|
|
|
||||||
|
LL | if true 'a {}
|
||||||
|
| ^^^^
|
||||||
|
help: try placing this code inside a block
|
||||||
|
|
|
||||||
|
LL | if true { 'a {} }
|
||||||
|
| + +
|
||||||
|
|
||||||
|
error: labeled expression must be followed by `:`
|
||||||
|
--> $DIR/label-after-block-like.rs:14:10
|
||||||
|
|
|
||||||
|
LL | loop 'a {}
|
||||||
|
| ---^^
|
||||||
|
| | |
|
||||||
|
| | help: add `:` after the label
|
||||||
|
| the label
|
||||||
|
|
|
||||||
|
= note: labels are used before loops and blocks, allowing e.g., `break 'label` to them
|
||||||
|
|
||||||
|
error: expected `{`, found `'a`
|
||||||
|
--> $DIR/label-after-block-like.rs:14:10
|
||||||
|
|
|
||||||
|
LL | loop 'a {}
|
||||||
|
| ---- ^^ expected `{`
|
||||||
|
| |
|
||||||
|
| while parsing this `loop` expression
|
||||||
|
|
|
||||||
|
help: try placing this code inside a block
|
||||||
|
|
|
||||||
|
LL | loop { 'a {} }
|
||||||
|
| + +
|
||||||
|
|
||||||
|
error: labeled expression must be followed by `:`
|
||||||
|
--> $DIR/label-after-block-like.rs:20:16
|
||||||
|
|
|
||||||
|
LL | while true 'a {}
|
||||||
|
| ---^^
|
||||||
|
| | |
|
||||||
|
| | help: add `:` after the label
|
||||||
|
| the label
|
||||||
|
|
|
||||||
|
= note: labels are used before loops and blocks, allowing e.g., `break 'label` to them
|
||||||
|
|
||||||
|
error: expected `{`, found `'a`
|
||||||
|
--> $DIR/label-after-block-like.rs:20:16
|
||||||
|
|
|
||||||
|
LL | while true 'a {}
|
||||||
|
| ----- ---- ^^ expected `{`
|
||||||
|
| | |
|
||||||
|
| | this `while` condition successfully parsed
|
||||||
|
| while parsing the body of this `while` expression
|
||||||
|
|
|
||||||
|
help: try placing this code inside a block
|
||||||
|
|
|
||||||
|
LL | while true { 'a {} }
|
||||||
|
| + +
|
||||||
|
|
||||||
|
error: labeled expression must be followed by `:`
|
||||||
|
--> $DIR/label-after-block-like.rs:26:23
|
||||||
|
|
|
||||||
|
LL | while let () = () 'a {}
|
||||||
|
| ---^^
|
||||||
|
| | |
|
||||||
|
| | help: add `:` after the label
|
||||||
|
| the label
|
||||||
|
|
|
||||||
|
= note: labels are used before loops and blocks, allowing e.g., `break 'label` to them
|
||||||
|
|
||||||
|
error: expected `{`, found `'a`
|
||||||
|
--> $DIR/label-after-block-like.rs:26:23
|
||||||
|
|
|
||||||
|
LL | while let () = () 'a {}
|
||||||
|
| ----- ----------- ^^ expected `{`
|
||||||
|
| | |
|
||||||
|
| | this `while` condition successfully parsed
|
||||||
|
| while parsing the body of this `while` expression
|
||||||
|
|
|
||||||
|
help: try placing this code inside a block
|
||||||
|
|
|
||||||
|
LL | while let () = () { 'a {} }
|
||||||
|
| + +
|
||||||
|
|
||||||
|
error: labeled expression must be followed by `:`
|
||||||
|
--> $DIR/label-after-block-like.rs:32:19
|
||||||
|
|
|
||||||
|
LL | for _ in 0..0 'a {}
|
||||||
|
| ---^^
|
||||||
|
| | |
|
||||||
|
| | help: add `:` after the label
|
||||||
|
| the label
|
||||||
|
|
|
||||||
|
= note: labels are used before loops and blocks, allowing e.g., `break 'label` to them
|
||||||
|
|
||||||
|
error: expected `{`, found `'a`
|
||||||
|
--> $DIR/label-after-block-like.rs:32:19
|
||||||
|
|
|
||||||
|
LL | for _ in 0..0 'a {}
|
||||||
|
| ^^ expected `{`
|
||||||
|
|
|
||||||
|
help: try placing this code inside a block
|
||||||
|
|
|
||||||
|
LL | for _ in 0..0 { 'a {} }
|
||||||
|
| + +
|
||||||
|
|
||||||
|
error: labeled expression must be followed by `:`
|
||||||
|
--> $DIR/label-after-block-like.rs:38:12
|
||||||
|
|
|
||||||
|
LL | unsafe 'a {}
|
||||||
|
| ---^^
|
||||||
|
| | |
|
||||||
|
| | help: add `:` after the label
|
||||||
|
| the label
|
||||||
|
|
|
||||||
|
= note: labels are used before loops and blocks, allowing e.g., `break 'label` to them
|
||||||
|
|
||||||
|
error: expected `{`, found `'a`
|
||||||
|
--> $DIR/label-after-block-like.rs:38:12
|
||||||
|
|
|
||||||
|
LL | unsafe 'a {}
|
||||||
|
| ------ ^^ expected `{`
|
||||||
|
| |
|
||||||
|
| while parsing this `unsafe` expression
|
||||||
|
|
|
||||||
|
help: try placing this code inside a block
|
||||||
|
|
|
||||||
|
LL | unsafe { 'a {} }
|
||||||
|
| + +
|
||||||
|
|
||||||
|
error: aborting due to 14 previous errors
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue