306612ea60
Currently the parser will interpret any label/lifetime in certain positions as a mistyped char literal, on the assumption that the trailing single quote was accidentally omitted. This is reasonable for a something like 'a (because 'a' would be valid) but not reasonable for a something like 'abc (because 'abc' is not valid). This commit restricts this behaviour only to labels/lifetimes that would be valid char literals, via the new `could_be_unclosed_char_literal` function. The commit also augments the `label-is-actually-char.rs` test in a couple of ways: - Adds testing of labels/lifetimes with identifiers longer than one char, e.g. 'abc. - Adds a new match with simpler patterns, because the `recover_unclosed_char` call in `parse_pat_with_range_pat` was not being exercised (in this test or any other ui tests). Fixes #120397, an assertion failure, which was caused by this behaviour in the parser interacting with some new stricter char literal checking added in #120329.
44 lines
1.2 KiB
Rust
44 lines
1.2 KiB
Rust
// Note: it's ok to interpret 'a as 'a', but but not ok to interpret 'abc as
|
|
// 'abc' because 'abc' is not a valid char literal.
|
|
|
|
fn main() {
|
|
let c = 'a;
|
|
//~^ ERROR expected `while`, `for`, `loop` or `{` after a label
|
|
//~| HELP add `'` to close the char literal
|
|
|
|
let c = 'abc;
|
|
//~^ ERROR expected `while`, `for`, `loop` or `{` after a label
|
|
//~| ERROR expected expression, found `;`
|
|
}
|
|
|
|
fn f() {
|
|
match 'a' {
|
|
'a'..='b => {}
|
|
//~^ ERROR unexpected token: `'b`
|
|
//~| HELP add `'` to close the char literal
|
|
'c'..='def => {}
|
|
//~^ ERROR unexpected token: `'def`
|
|
}
|
|
}
|
|
|
|
fn g() {
|
|
match 'g' {
|
|
'g => {}
|
|
//~^ ERROR expected pattern, found `=>`
|
|
//~| HELP add `'` to close the char literal
|
|
'hij => {}
|
|
//~^ ERROR expected pattern, found `'hij`
|
|
_ => {}
|
|
}
|
|
}
|
|
|
|
fn h() {
|
|
let x = ['a, 'b, 'cde];
|
|
//~^ ERROR expected `while`, `for`, `loop` or `{` after a label
|
|
//~| HELP add `'` to close the char literal
|
|
//~| ERROR expected `while`, `for`, `loop` or `{` after a label
|
|
//~| HELP add `'` to close the char literal
|
|
//~| ERROR expected `while`, `for`, `loop` or `{` after a label
|
|
//~| ERROR expected expression, found `]`
|
|
}
|