Don't expect bodyless arms if the pattern can never be a never pattern
This commit is contained in:
parent
f4d794ea0b
commit
7d6cd6bf1f
12 changed files with 32 additions and 26 deletions
|
@ -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(
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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: `#`
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 `[`
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
fn main() {
|
||||
match 42 {
|
||||
x < 7 => (),
|
||||
//~^ error: expected one of `,`, `=>`, `@`, `if`, `|`, or `}`, found `<`
|
||||
//~^ error: expected one of `=>`, `@`, `if`, or `|`, found `<`
|
||||
_ => ()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue