-
Notifications
You must be signed in to change notification settings - Fork 12.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Be more careful about interpreting a label as a mistyped char literal.
Currently the parser will interpret any label in certain positions as a mistyped char literal, on the assumption that the trailing single quote was accidentally omitted. This is reasonable for a label like 'a (because 'a' would be valid) but not reasonable for a label like 'abc (because 'abc' is not valid). This commit restricts this behaviour only to labels 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 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.
- Loading branch information
1 parent
5bda589
commit 0a568fb
Showing
4 changed files
with
112 additions
and
23 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,16 +1,43 @@ | ||
// 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 | ||
match c { | ||
|
||
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` | ||
} | ||
let x = ['a, 'b]; | ||
//~^ ERROR expected `while`, `for`, `loop` or `{` after a label | ||
//~| ERROR expected `while`, `for`, `loop` or `{` after a label | ||
//~| HELP add `'` to close the char literal | ||
//~| HELP add `'` to close the char literal | ||
} | ||
|
||
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 `]` | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters