-
Notifications
You must be signed in to change notification settings - Fork 12.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of #128865 - jieyouxu:unicurd, r=Urgau
Ensure let stmt compound assignment removal suggestion respect codepoint boundaries Previously we would try to issue a suggestion for `let x <op>= 1`, i.e. a compound assignment within a `let` binding, to remove the `<op>`. The suggestion code unfortunately incorrectly assumed that the `<op>` is an exactly-1-byte ASCII character, but this assumption is incorrect because we also recover Unicode-confusables like `➖=` as `-=`. In this example, the suggestion code used a `+ BytePos(1)` to calculate the span of the `<op>` codepoint that looks like `-` but the mult-byte Unicode look-alike would cause the suggested removal span to be inside a multi-byte codepoint boundary, triggering a codepoint boundary assertion. The fix is to use `SourceMap::start_point(token_span)` which properly accounts for codepoint boundaries. Fixes #128845. cc #128790 r? ````@fmease````
- Loading branch information
Showing
3 changed files
with
48 additions
and
2 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
//! Previously we would try to issue a suggestion for `let x <op>= 1`, i.e. a compound assignment | ||
//! within a `let` binding, to remove the `<op>`. The suggestion code unfortunately incorrectly | ||
//! assumed that the `<op>` is an exactly-1-byte ASCII character, but this assumption is incorrect | ||
//! because we also recover Unicode-confusables like `➖=` as `-=`. In this example, the suggestion | ||
//! code used a `+ BytePos(1)` to calculate the span of the `<op>` codepoint that looks like `-` but | ||
//! the mult-byte Unicode look-alike would cause the suggested removal span to be inside a | ||
//! multi-byte codepoint boundary, triggering a codepoint boundary assertion. | ||
//! | ||
//! issue: rust-lang/rust#128845 | ||
|
||
fn main() { | ||
// Adapted from #128845 but with irrelevant components removed and simplified. | ||
let x ➖= 1; | ||
//~^ ERROR unknown start of token: \u{2796} | ||
//~| ERROR: can't reassign to an uninitialized variable | ||
} |
26 changes: 26 additions & 0 deletions
26
tests/ui/parser/suggest-remove-compount-assign-let-ice.stderr
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 |
---|---|---|
@@ -0,0 +1,26 @@ | ||
error: unknown start of token: \u{2796} | ||
--> $DIR/suggest-remove-compount-assign-let-ice.rs:13:11 | ||
| | ||
LL | let x ➖= 1; | ||
| ^^ | ||
| | ||
help: Unicode character '➖' (Heavy Minus Sign) looks like '-' (Minus/Hyphen), but it is not | ||
| | ||
LL | let x -= 1; | ||
| ~ | ||
|
||
error: can't reassign to an uninitialized variable | ||
--> $DIR/suggest-remove-compount-assign-let-ice.rs:13:11 | ||
| | ||
LL | let x ➖= 1; | ||
| ^^^ | ||
| | ||
= help: if you meant to overwrite, remove the `let` binding | ||
help: initialize the variable | ||
| | ||
LL - let x ➖= 1; | ||
LL + let x = 1; | ||
| | ||
|
||
error: aborting due to 2 previous errors | ||
|