Don't expect bodyless arms if the pattern can never be a never pattern

This commit is contained in:
Lieselotte 2023-12-28 15:02:17 +01:00
parent f4d794ea0b
commit 7d6cd6bf1f
No known key found for this signature in database
GPG key ID: 43A6A32F83A6F9B1
12 changed files with 32 additions and 26 deletions

View file

@ -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(

View file

@ -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),

View file

@ -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

View file

@ -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),

View file

@ -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

View file

@ -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: `#`

View file

@ -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
@ -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
@ -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

View file

@ -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 `[`
_ => {}
}
}

View file

@ -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

View file

@ -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
@ -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

View file

@ -1,7 +1,7 @@
fn main() {
match 42 {
x < 7 => (),
//~^ error: expected one of `,`, `=>`, `@`, `if`, `|`, or `}`, found `<`
//~^ error: expected one of `=>`, `@`, `if`, or `|`, found `<`
_ => ()
}
}

View file

@ -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