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
|
let is_almost_fat_arrow = TokenKind::FatArrow
|
||||||
.similar_tokens()
|
.similar_tokens()
|
||||||
.is_some_and(|similar_tokens| similar_tokens.contains(&this.token.kind));
|
.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.
|
// A pattern without a body, allowed for never patterns.
|
||||||
arm_body = None;
|
arm_body = None;
|
||||||
this.expect_one_of(&[token::Comma], &[token::CloseDelim(Delimiter::Brace)]).map(
|
this.expect_one_of(&[token::Comma], &[token::CloseDelim(Delimiter::Brace)]).map(
|
||||||
|
|
|
@ -17,7 +17,7 @@ fn main() {
|
||||||
}
|
}
|
||||||
match x as i32 {
|
match x as i32 {
|
||||||
0..5+1 => errors_only.push(x),
|
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),
|
1 | -3..0 => first_or.push(x),
|
||||||
y @ (0..5 | 6) => or_two.push(y),
|
y @ (0..5 | 6) => or_two.push(y),
|
||||||
y @ 0..const { 5 + 1 } => assert_eq!(y, 5),
|
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
|
--> $DIR/range_pat_interactions1.rs:19:17
|
||||||
|
|
|
|
||||||
LL | 0..5+1 => errors_only.push(x),
|
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
|
error[E0408]: variable `n` is not bound in all patterns
|
||||||
--> $DIR/range_pat_interactions1.rs:10:25
|
--> $DIR/range_pat_interactions1.rs:10:25
|
||||||
|
|
|
@ -9,7 +9,7 @@ fn main() {
|
||||||
match x as i32 {
|
match x as i32 {
|
||||||
0..=(5+1) => errors_only.push(x),
|
0..=(5+1) => errors_only.push(x),
|
||||||
//~^ error: inclusive range with no end
|
//~^ 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),
|
1 | -3..0 => first_or.push(x),
|
||||||
y @ (0..5 | 6) => or_two.push(y),
|
y @ (0..5 | 6) => or_two.push(y),
|
||||||
y @ 0..const { 5 + 1 } => assert_eq!(y, 5),
|
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`)
|
= 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
|
--> $DIR/range_pat_interactions2.rs:10:17
|
||||||
|
|
|
|
||||||
LL | 0..=(5+1) => errors_only.push(x),
|
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
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
|
@ -84,15 +84,15 @@ fn main() {}
|
||||||
|
|
||||||
#[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] 10 => () } }
|
#[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] 10 => () } }
|
||||||
//~^ ERROR inclusive range with no end
|
//~^ 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 => () } }
|
#[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] -10 => () } }
|
||||||
//~^ ERROR inclusive range with no end
|
//~^ 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 => () } }
|
#[cfg(FALSE)] fn e() { match 0 { 0..=-#[attr] 10 => () } }
|
||||||
//~^ ERROR unexpected token: `#`
|
//~^ ERROR unexpected token: `#`
|
||||||
#[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] FOO => () } }
|
#[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] FOO => () } }
|
||||||
//~^ ERROR inclusive range with no end
|
//~^ 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(); }
|
#[cfg(FALSE)] fn e() { let _ = x.#![attr]foo(); }
|
||||||
//~^ ERROR unexpected token: `#`
|
//~^ 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`)
|
= 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
|
--> $DIR/attr-stmt-expr-attr-bad.rs:85:38
|
||||||
|
|
|
|
||||||
LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] 10 => () } }
|
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
|
error[E0586]: inclusive range with no end
|
||||||
--> $DIR/attr-stmt-expr-attr-bad.rs:88:35
|
--> $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`)
|
= 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
|
--> $DIR/attr-stmt-expr-attr-bad.rs:88:38
|
||||||
|
|
|
|
||||||
LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] -10 => () } }
|
LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] -10 => () } }
|
||||||
| ^ expected one of `,`, `=>`, `if`, `|`, or `}`
|
| ^ expected one of `=>`, `if`, or `|`
|
||||||
|
|
||||||
error: unexpected token: `#`
|
error: unexpected token: `#`
|
||||||
--> $DIR/attr-stmt-expr-attr-bad.rs:91:39
|
--> $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`)
|
= 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
|
--> $DIR/attr-stmt-expr-attr-bad.rs:93:38
|
||||||
|
|
|
|
||||||
LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] FOO => () } }
|
LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] FOO => () } }
|
||||||
| ^ expected one of `,`, `=>`, `if`, `|`, or `}`
|
| ^ expected one of `=>`, `if`, or `|`
|
||||||
|
|
||||||
error: unexpected token: `#`
|
error: unexpected token: `#`
|
||||||
--> $DIR/attr-stmt-expr-attr-bad.rs:97:34
|
--> $DIR/attr-stmt-expr-attr-bad.rs:97:34
|
||||||
|
|
|
@ -3,7 +3,7 @@ static tmp : [&'static str; 2] = ["hello", "he"];
|
||||||
fn main() {
|
fn main() {
|
||||||
let z = "hello";
|
let z = "hello";
|
||||||
match z {
|
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
|
--> $DIR/issue-24375.rs:6:12
|
||||||
|
|
|
|
||||||
LL | tmp[0] => {}
|
LL | tmp[0] => {}
|
||||||
| ^ expected one of `,`, `=>`, `@`, `if`, `|`, or `}`
|
| ^ expected one of `=>`, `@`, `if`, or `|`
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
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
|
--> $DIR/match-arm-without-body.rs:13:9
|
||||||
|
|
|
|
||||||
LL | Some(_)
|
LL | Some(_)
|
||||||
| - expected one of `,`, `=>`, `if`, `|`, or `}`
|
| - expected one of `=>`, `if`, or `|`
|
||||||
LL | _ => {}
|
LL | _ => {}
|
||||||
| ^ unexpected token
|
| ^ unexpected token
|
||||||
|
|
||||||
|
@ -44,11 +44,11 @@ LL +
|
||||||
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
|
--> $DIR/match-arm-without-body.rs:36:9
|
||||||
|
|
|
|
||||||
LL | Some(_) if true
|
LL | Some(_) if true
|
||||||
| - expected one of `,`, `.`, `=>`, `?`, `}`, or an operator
|
| - expected one of `.`, `=>`, `?`, or an operator
|
||||||
LL | _ => {}
|
LL | _ => {}
|
||||||
| ^ unexpected token
|
| ^ unexpected token
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
fn main() {
|
fn main() {
|
||||||
match 42 {
|
match 42 {
|
||||||
x < 7 => (),
|
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
|
--> $DIR/pat-lt-bracket-1.rs:3:7
|
||||||
|
|
|
|
||||||
LL | x < 7 => (),
|
LL | x < 7 => (),
|
||||||
| ^ expected one of `,`, `=>`, `@`, `if`, `|`, or `}`
|
| ^ expected one of `=>`, `@`, `if`, or `|`
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue