Skip to content

Commit

Permalink
Remove MacCall special case from recovery after missing 'if' after 'e…
Browse files Browse the repository at this point in the history
…lse'

The change to the test is a little goofy because the compiler was
guessing "correctly" before that `falsy! {}` is the condition as opposed
to the else body. But I believe this change is fundamentally correct.
Braced macro invocations in statement position are most often item-like
(`thread_local! {...}`) as opposed to parenthesized macro invocations
which are condition-like (`cfg!(...)`).
  • Loading branch information
dtolnay committed Dec 30, 2023
1 parent ed5a1af commit 74eca51
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 12 deletions.
34 changes: 28 additions & 6 deletions compiler/rustc_parse/src/parser/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2606,13 +2606,35 @@ impl<'a> Parser<'a> {
let first_tok_span = self.token.span;
match self.parse_expr() {
Ok(cond)
// If it's not a free-standing expression, and is followed by a block,
// then it's very likely the condition to an `else if`.
// Try to guess the difference between a "condition-like" vs
// "item-like" expression.
//
// We are seeing the following code, in which $cond is neither
// ExprKind::Block nor ExprKind::If (the 2 cases wherein this
// would be valid syntax).
//
// if ... {
// } else $cond
//
// If $cond is "condition-like" such as ExprKind::Binary, we
// want to suggest inserting `if`.
//
// if ... {
// } else if a == b {
// ^^
// }
//
// If $cond is "item-like" such as ExprKind::While then we want
// to suggest wrapping in braces.
//
// if ... {
// } else {
// ^
// while true {}
// }
// ^
if self.check(&TokenKind::OpenDelim(Delimiter::Brace))
&& match cond.kind {
ExprKind::MacCall(_) => true,
_ => classify::expr_requires_semi_to_be_stmt(&cond),
} =>
&& classify::expr_requires_semi_to_be_stmt(&cond) =>
{
self.dcx().emit_err(errors::ExpectedElseBlock {
first_tok_span,
Expand Down
10 changes: 4 additions & 6 deletions tests/ui/parser/else-no-if.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,12 @@ error: expected `{`, found `falsy`
--> $DIR/else-no-if.rs:47:12
|
LL | } else falsy! {} {
| ---- ^^^^^
| |
| expected an `if` or a block after this `else`
| ^^^^^ expected `{`
|
help: add an `if` if this is the condition of a chained `else if` statement
help: try placing this code inside a block
|
LL | } else if falsy! {} {
| ++
LL | } else { falsy! {} } {
| + +

error: expected `{`, found `falsy`
--> $DIR/else-no-if.rs:54:12
Expand Down

0 comments on commit 74eca51

Please sign in to comment.