mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-06 04:08:40 +00:00
Auto merge of #107526 - obeis:for-missing-iterator, r=estebank,compiler-errors
Recover form missing expression in `for` loop Close #78537 r? `@estebank`
This commit is contained in:
commit
75a0be98f2
@ -128,6 +128,9 @@ parse_missing_in_in_for_loop = missing `in` in `for` loop
|
|||||||
.use_in_not_of = try using `in` here instead
|
.use_in_not_of = try using `in` here instead
|
||||||
.add_in = try adding `in` here
|
.add_in = try adding `in` here
|
||||||
|
|
||||||
|
parse_missing_expression_in_for_loop = missing expression to iterate on in `for` loop
|
||||||
|
.suggestion = try adding an expression to the `for` loop
|
||||||
|
|
||||||
parse_missing_comma_after_match_arm = expected `,` following `match` arm
|
parse_missing_comma_after_match_arm = expected `,` following `match` arm
|
||||||
.suggestion = missing a comma here to end this `match` arm
|
.suggestion = missing a comma here to end this `match` arm
|
||||||
|
|
||||||
|
@ -433,6 +433,18 @@ pub(crate) enum MissingInInForLoopSub {
|
|||||||
AddIn(#[primary_span] Span),
|
AddIn(#[primary_span] Span),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(parse_missing_expression_in_for_loop)]
|
||||||
|
pub(crate) struct MissingExpressionInForLoop {
|
||||||
|
#[primary_span]
|
||||||
|
#[suggestion(
|
||||||
|
code = "/* expression */ ",
|
||||||
|
applicability = "has-placeholders",
|
||||||
|
style = "verbose"
|
||||||
|
)]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(parse_missing_comma_after_match_arm)]
|
#[diag(parse_missing_comma_after_match_arm)]
|
||||||
pub(crate) struct MissingCommaAfterMatchArm {
|
pub(crate) struct MissingCommaAfterMatchArm {
|
||||||
|
@ -2471,6 +2471,21 @@ impl<'a> Parser<'a> {
|
|||||||
|
|
||||||
let pat = self.recover_parens_around_for_head(pat, begin_paren);
|
let pat = self.recover_parens_around_for_head(pat, begin_paren);
|
||||||
|
|
||||||
|
// Recover from missing expression in `for` loop
|
||||||
|
if matches!(expr.kind, ExprKind::Block(..))
|
||||||
|
&& !matches!(self.token.kind, token::OpenDelim(token::Delimiter::Brace))
|
||||||
|
&& self.may_recover()
|
||||||
|
{
|
||||||
|
self.sess
|
||||||
|
.emit_err(errors::MissingExpressionInForLoop { span: expr.span.shrink_to_lo() });
|
||||||
|
let err_expr = self.mk_expr(expr.span, ExprKind::Err);
|
||||||
|
let block = self.mk_block(vec![], BlockCheckMode::Default, self.prev_token.span);
|
||||||
|
return Ok(self.mk_expr(
|
||||||
|
lo.to(self.prev_token.span),
|
||||||
|
ExprKind::ForLoop(pat, err_expr, block, opt_label),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
let (attrs, loop_block) = self.parse_inner_attrs_and_block()?;
|
let (attrs, loop_block) = self.parse_inner_attrs_and_block()?;
|
||||||
|
|
||||||
let kind = ExprKind::ForLoop(pat, expr, loop_block, opt_label);
|
let kind = ExprKind::ForLoop(pat, expr, loop_block, opt_label);
|
||||||
|
5
tests/ui/parser/missing-expression-in-for-loop.rs
Normal file
5
tests/ui/parser/missing-expression-in-for-loop.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
fn main() {
|
||||||
|
for i in {
|
||||||
|
//~^ ERROR missing expression to iterate on in `for` loop
|
||||||
|
}
|
||||||
|
}
|
13
tests/ui/parser/missing-expression-in-for-loop.stderr
Normal file
13
tests/ui/parser/missing-expression-in-for-loop.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error: missing expression to iterate on in `for` loop
|
||||||
|
--> $DIR/missing-expression-in-for-loop.rs:2:14
|
||||||
|
|
|
||||||
|
LL | for i in {
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
help: try adding an expression to the `for` loop
|
||||||
|
|
|
||||||
|
LL | for i in /* expression */ {
|
||||||
|
| ++++++++++++++++
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
Loading…
Reference in New Issue
Block a user