Skip to content

Commit

Permalink
Rollup merge of rust-lang#90861 - 5225225:nonprinting-char, r=davidtwco
Browse files Browse the repository at this point in the history
Print escaped string if char literal has multiple characters, but only one printable character

Fixes rust-lang#90857

I'm not sure about the error message here, it could get rather long and *maybe* using the names of characters would be better? That wouldn't help the length any, though.
  • Loading branch information
matthiaskrgr authored Nov 15, 2021
2 parents b4bd0a2 + e197392 commit eeedb0a
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 0 deletions.
27 changes: 27 additions & 0 deletions compiler/rustc_parse/src/lexer/unescape_error_reporting.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,33 @@ pub(crate) fn emit_unescape_error(
Applicability::MachineApplicable,
);
}
} else {
let printable: Vec<char> = lit
.chars()
.filter(|&x| {
unicode_width::UnicodeWidthChar::width(x).unwrap_or(0) != 0
&& !x.is_whitespace()
})
.collect();

if let [ch] = printable.as_slice() {
has_help = true;

handler.span_note(
span,
&format!(
"there are non-printing characters, the full sequence is `{}`",
lit.escape_default(),
),
);

handler.span_suggestion(
span,
"consider removing the non-printing characters",
ch.to_string(),
Applicability::MaybeIncorrect,
);
}
}

if !has_help {
Expand Down
10 changes: 10 additions & 0 deletions src/test/ui/parser/char/whitespace-character-literal.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// This tests that the error generated when a character literal has multiple
// characters in it contains a note about non-printing characters.

fn main() {
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}`
//~| HELP: consider removing the non-printing characters
//~| SUGGESTION: x
}
16 changes: 16 additions & 0 deletions src/test/ui/parser/char/whitespace-character-literal.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
error: character literal may only contain one codepoint
--> $DIR/whitespace-character-literal.rs:5:30
|
LL | let _hair_space_around = ' x​';
| ^--^
| |
| help: consider removing the non-printing characters: `x`
|
note: there are non-printing characters, the full sequence is `\u{200a}x\u{200b}`
--> $DIR/whitespace-character-literal.rs:5:31
|
LL | let _hair_space_around = ' x​';
| ^^

error: aborting due to previous error

0 comments on commit eeedb0a

Please sign in to comment.