Print full char literal on error if any are non-printing

This commit is contained in:
5225225 2021-11-13 11:14:17 +00:00
parent 02063124f9
commit de05d3ec31
3 changed files with 37 additions and 0 deletions

View file

@ -82,6 +82,16 @@ pub(crate) fn emit_unescape_error(
Applicability::MachineApplicable,
);
}
} else {
if lit.chars().filter(|x| x.is_whitespace() || x.is_control()).count() >= 1 {
handler.span_note(
span,
&format!(
"there are non-printing characters, the full sequence is `{}`",
lit.escape_default(),
),
);
}
}
if !has_help {

View file

@ -0,0 +1,9 @@
// This tests that the error generated when a character literal has multiple
// characters in it contains a note about non-printing characters.
fn main() {
// <hair space>x<zero width space>
let _hair_space_around = 'x';
//~^ ERROR: character literal may only contain one codepoint
//~| NOTE: there are non-printing characters, the full sequence is `\u{200a}x\u{200b}`
}

View file

@ -0,0 +1,18 @@
error: character literal may only contain one codepoint
--> $DIR/whitespace-character-literal.rs:6:30
|
LL | let _hair_space_around = 'x';
| ^^^^
|
note: there are non-printing characters, the full sequence is `\u{200a}x\u{200b}`
--> $DIR/whitespace-character-literal.rs:6:31
|
LL | let _hair_space_around = 'x';
| ^^
help: if you meant to write a `str` literal, use double quotes
|
LL | let _hair_space_around = "x";
| ~~~~
error: aborting due to previous error