Skip to content

Commit

Permalink
Don't expect bodyless arms if the pattern can never be a never pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
ShE3py committed Dec 28, 2023
1 parent f4d794e commit 7d6cd6b
Show file tree
Hide file tree
Showing 12 changed files with 32 additions and 26 deletions.
8 changes: 7 additions & 1 deletion compiler/rustc_parse/src/parser/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2937,7 +2937,13 @@ impl<'a> Parser<'a> {
let is_almost_fat_arrow = TokenKind::FatArrow
.similar_tokens()
.is_some_and(|similar_tokens| similar_tokens.contains(&this.token.kind));
let mut result = if !is_fat_arrow && !is_almost_fat_arrow {

// this avoids the compiler saying that a `,` or `}` was expected even though
// the pattern isn't a never pattern (and thus an arm body is required)
let armless = (!is_fat_arrow && !is_almost_fat_arrow && pat.could_be_never_pattern())
|| matches!(this.token.kind, token::Comma | token::CloseDelim(Delimiter::Brace));

let mut result = if armless {
// A pattern without a body, allowed for never patterns.
arm_body = None;
this.expect_one_of(&[token::Comma], &[token::CloseDelim(Delimiter::Brace)]).map(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ fn main() {
}
match x as i32 {
0..5+1 => errors_only.push(x),
//~^ error: expected one of `,`, `=>`, `if`, `|`, or `}`, found `+`
//~^ error: expected one of `=>`, `if`, or `|`, found `+`
1 | -3..0 => first_or.push(x),
y @ (0..5 | 6) => or_two.push(y),
y @ 0..const { 5 + 1 } => assert_eq!(y, 5),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
error: expected one of `,`, `=>`, `if`, `|`, or `}`, found `+`
error: expected one of `=>`, `if`, or `|`, found `+`
--> $DIR/range_pat_interactions1.rs:19:17
|
LL | 0..5+1 => errors_only.push(x),
| ^ expected one of `,`, `=>`, `if`, `|`, or `}`
| ^ expected one of `=>`, `if`, or `|`

error[E0408]: variable `n` is not bound in all patterns
--> $DIR/range_pat_interactions1.rs:10:25
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ fn main() {
match x as i32 {
0..=(5+1) => errors_only.push(x),
//~^ error: inclusive range with no end
//~| error: expected one of `,`, `=>`, `if`, `|`, or `}`, found `(`
//~| error: expected one of `=>`, `if`, or `|`, found `(`
1 | -3..0 => first_or.push(x),
y @ (0..5 | 6) => or_two.push(y),
y @ 0..const { 5 + 1 } => assert_eq!(y, 5),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ LL | 0..=(5+1) => errors_only.push(x),
|
= note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`)

error: expected one of `,`, `=>`, `if`, `|`, or `}`, found `(`
error: expected one of `=>`, `if`, or `|`, found `(`
--> $DIR/range_pat_interactions2.rs:10:17
|
LL | 0..=(5+1) => errors_only.push(x),
| ^ expected one of `,`, `=>`, `if`, `|`, or `}`
| ^ expected one of `=>`, `if`, or `|`

error: aborting due to 2 previous errors

Expand Down
6 changes: 3 additions & 3 deletions tests/ui/parser/attribute/attr-stmt-expr-attr-bad.rs
Original file line number Diff line number Diff line change
Expand Up @@ -84,15 +84,15 @@ fn main() {}

#[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] 10 => () } }
//~^ ERROR inclusive range with no end
//~| ERROR expected one of `,`, `=>`, `if`, `|`, or `}`, found `#`
//~| ERROR expected one of `=>`, `if`, or `|`, found `#`
#[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] -10 => () } }
//~^ ERROR inclusive range with no end
//~| ERROR expected one of `,`, `=>`, `if`, `|`, or `}`, found `#`
//~| ERROR expected one of `=>`, `if`, or `|`, found `#`
#[cfg(FALSE)] fn e() { match 0 { 0..=-#[attr] 10 => () } }
//~^ ERROR unexpected token: `#`
#[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] FOO => () } }
//~^ ERROR inclusive range with no end
//~| ERROR expected one of `,`, `=>`, `if`, `|`, or `}`, found `#`
//~| ERROR expected one of `=>`, `if`, or `|`, found `#`

#[cfg(FALSE)] fn e() { let _ = x.#![attr]foo(); }
//~^ ERROR unexpected token: `#`
Expand Down
12 changes: 6 additions & 6 deletions tests/ui/parser/attribute/attr-stmt-expr-attr-bad.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -365,11 +365,11 @@ LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] 10 => () } }
|
= note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`)

error: expected one of `,`, `=>`, `if`, `|`, or `}`, found `#`
error: expected one of `=>`, `if`, or `|`, found `#`
--> $DIR/attr-stmt-expr-attr-bad.rs:85:38
|
LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] 10 => () } }
| ^ expected one of `,`, `=>`, `if`, `|`, or `}`
| ^ expected one of `=>`, `if`, or `|`

error[E0586]: inclusive range with no end
--> $DIR/attr-stmt-expr-attr-bad.rs:88:35
Expand All @@ -379,11 +379,11 @@ LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] -10 => () } }
|
= note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`)

error: expected one of `,`, `=>`, `if`, `|`, or `}`, found `#`
error: expected one of `=>`, `if`, or `|`, found `#`
--> $DIR/attr-stmt-expr-attr-bad.rs:88:38
|
LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] -10 => () } }
| ^ expected one of `,`, `=>`, `if`, `|`, or `}`
| ^ expected one of `=>`, `if`, or `|`

error: unexpected token: `#`
--> $DIR/attr-stmt-expr-attr-bad.rs:91:39
Expand All @@ -399,11 +399,11 @@ LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] FOO => () } }
|
= note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`)

error: expected one of `,`, `=>`, `if`, `|`, or `}`, found `#`
error: expected one of `=>`, `if`, or `|`, found `#`
--> $DIR/attr-stmt-expr-attr-bad.rs:93:38
|
LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] FOO => () } }
| ^ expected one of `,`, `=>`, `if`, `|`, or `}`
| ^ expected one of `=>`, `if`, or `|`

error: unexpected token: `#`
--> $DIR/attr-stmt-expr-attr-bad.rs:97:34
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/parser/issues/issue-24375.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ static tmp : [&'static str; 2] = ["hello", "he"];
fn main() {
let z = "hello";
match z {
tmp[0] => {} //~ ERROR expected one of `,`, `=>`, `@`, `if`, `|`, or `}`, found `[`
tmp[0] => {} //~ ERROR expected one of `=>`, `@`, `if`, or `|`, found `[`
_ => {}
}
}
4 changes: 2 additions & 2 deletions tests/ui/parser/issues/issue-24375.stderr
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
error: expected one of `,`, `=>`, `@`, `if`, `|`, or `}`, found `[`
error: expected one of `=>`, `@`, `if`, or `|`, found `[`
--> $DIR/issue-24375.rs:6:12
|
LL | tmp[0] => {}
| ^ expected one of `,`, `=>`, `@`, `if`, `|`, or `}`
| ^ expected one of `=>`, `@`, `if`, or `|`

error: aborting due to 1 previous error

8 changes: 4 additions & 4 deletions tests/ui/parser/match-arm-without-body.stderr
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
error: expected one of `,`, `=>`, `if`, `|`, or `}`, found reserved identifier `_`
error: expected one of `=>`, `if`, or `|`, found reserved identifier `_`
--> $DIR/match-arm-without-body.rs:13:9
|
LL | Some(_)
| - expected one of `,`, `=>`, `if`, `|`, or `}`
| - expected one of `=>`, `if`, or `|`
LL | _ => {}
| ^ unexpected token

Expand Down Expand Up @@ -44,11 +44,11 @@ LL +
LL ~ _ => {}
|

error: expected one of `,`, `.`, `=>`, `?`, `}`, or an operator, found reserved identifier `_`
error: expected one of `.`, `=>`, `?`, or an operator, found reserved identifier `_`
--> $DIR/match-arm-without-body.rs:36:9
|
LL | Some(_) if true
| - expected one of `,`, `.`, `=>`, `?`, `}`, or an operator
| - expected one of `.`, `=>`, `?`, or an operator
LL | _ => {}
| ^ unexpected token

Expand Down
2 changes: 1 addition & 1 deletion tests/ui/parser/pat-lt-bracket-1.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
fn main() {
match 42 {
x < 7 => (),
//~^ error: expected one of `,`, `=>`, `@`, `if`, `|`, or `}`, found `<`
//~^ error: expected one of `=>`, `@`, `if`, or `|`, found `<`
_ => ()
}
}
4 changes: 2 additions & 2 deletions tests/ui/parser/pat-lt-bracket-1.stderr
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
error: expected one of `,`, `=>`, `@`, `if`, `|`, or `}`, found `<`
error: expected one of `=>`, `@`, `if`, or `|`, found `<`
--> $DIR/pat-lt-bracket-1.rs:3:7
|
LL | x < 7 => (),
| ^ expected one of `,`, `=>`, `@`, `if`, `|`, or `}`
| ^ expected one of `=>`, `@`, `if`, or `|`

error: aborting due to 1 previous error

0 comments on commit 7d6cd6b

Please sign in to comment.