diff options
| author | Cameron Steffen <cam.steffen94@gmail.com> | 2021-08-02 09:36:51 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-08-02 09:36:51 -0500 |
| commit | 43800563975dcd69720f1ff34af66d85933a3573 (patch) | |
| tree | 4418c7b7a91f714c1ba67f2c099452d30d82c1ab /compiler/rustc_parse | |
| parent | b1166e14b626bbfe1921b42d11ff8b7dfaf91855 (diff) | |
| parent | c1abb6f4d6756086d74008cacf51e42ae2cda7bb (diff) | |
| download | rust-43800563975dcd69720f1ff34af66d85933a3573.tar.gz rust-43800563975dcd69720f1ff34af66d85933a3573.zip | |
Rollup merge of #87659 - FabianWolff:issue-87397, r=davidtwco
Fix invalid suggestions for non-ASCII characters in byte constants Fixes #87397.
Diffstat (limited to 'compiler/rustc_parse')
| -rw-r--r-- | compiler/rustc_parse/src/lexer/unescape_error_reporting.rs | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/compiler/rustc_parse/src/lexer/unescape_error_reporting.rs b/compiler/rustc_parse/src/lexer/unescape_error_reporting.rs index 1c5be61130b..4e95cdc0efa 100644 --- a/compiler/rustc_parse/src/lexer/unescape_error_reporting.rs +++ b/compiler/rustc_parse/src/lexer/unescape_error_reporting.rs @@ -153,16 +153,37 @@ pub(crate) fn emit_unescape_error( EscapeError::NonAsciiCharInByte => { assert!(mode.is_bytes()); let (c, span) = last_char(); - handler - .struct_span_err(span, "non-ASCII character in byte constant") - .span_label(span, "byte constant must be ASCII") - .span_suggestion( + let mut err = handler.struct_span_err(span, "non-ASCII character in byte constant"); + err.span_label(span, "byte constant must be ASCII"); + if (c as u32) <= 0xFF { + err.span_suggestion( span, - "use a \\xHH escape for a non-ASCII byte", + &format!( + "if you meant to use the unicode code point for '{}', use a \\xHH escape", + c + ), format!("\\x{:X}", c as u32), - Applicability::MachineApplicable, - ) - .emit(); + Applicability::MaybeIncorrect, + ); + } else if matches!(mode, Mode::Byte) { + err.span_label(span, "this multibyte character does not fit into a single byte"); + } else if matches!(mode, Mode::ByteStr) { + let mut utf8 = String::new(); + utf8.push(c); + err.span_suggestion( + span, + &format!( + "if you meant to use the UTF-8 encoding of '{}', use \\xHH escapes", + c + ), + utf8.as_bytes() + .iter() + .map(|b: &u8| format!("\\x{:X}", *b)) + .fold("".to_string(), |a, c| a + &c), + Applicability::MaybeIncorrect, + ); + } + err.emit(); } EscapeError::NonAsciiCharInByteString => { assert!(mode.is_bytes()); |
