diff --git a/src/libsyntax/parse/lexer/mod.rs b/src/libsyntax/parse/lexer/mod.rs index d13de002968..fb46f7a08b9 100644 --- a/src/libsyntax/parse/lexer/mod.rs +++ b/src/libsyntax/parse/lexer/mod.rs @@ -945,12 +945,36 @@ impl<'a> StringReader<'a> { self.scan_unicode_escape(delim) && !ascii_only } else { let span = self.mk_sp(start, self.pos); - self.sess.span_diagnostic - .struct_span_err(span, "incorrect unicode escape sequence") - .span_help(span, - "format of unicode escape sequences is \ - `\\u{…}`") - .emit(); + let mut suggestion = "\\u{".to_owned(); + let mut err = self.sess.span_diagnostic.struct_span_err( + span, + "incorrect unicode escape sequence", + ); + let mut i = 0; + while let (Some(ch), true) = (self.ch, i < 6) { + if ch.is_digit(16) { + suggestion.push(ch); + self.bump(); + i += 1; + } else { + break; + } + } + if i != 0 { + suggestion.push('}'); + err.span_suggestion_with_applicability( + self.mk_sp(start, self.pos), + "format of unicode escape sequences uses braces", + suggestion, + Applicability::MaybeIncorrect, + ); + } else { + err.span_help( + span, + "format of unicode escape sequences is `\\u{…}`", + ); + } + err.emit(); false }; if ascii_only { diff --git a/src/libsyntax_ext/format.rs b/src/libsyntax_ext/format.rs index 3a5f0ec07e7..c11f27f3ed5 100644 --- a/src/libsyntax_ext/format.rs +++ b/src/libsyntax_ext/format.rs @@ -845,8 +845,8 @@ pub fn expand_preparsed_format_args(ecx: &mut ExtCtxt, } } else if next_c.is_digit(16) { skips.push(next_pos); - // We suggest adding `{` and `}` when appropriate, accept it here as if it - // were correct + // We suggest adding `{` and `}` when appropriate, accept it here as if + // it were correct let mut i = 0; // consume up to 6 hexanumeric chars while let (Some((next_pos, c)), _) = (s.next(), i < 6) { if c.is_digit(16) { diff --git a/src/test/ui/fmt/format-string-error-2.stderr b/src/test/ui/fmt/format-string-error-2.stderr index ae62ed66338..baab8529940 100644 --- a/src/test/ui/fmt/format-string-error-2.stderr +++ b/src/test/ui/fmt/format-string-error-2.stderr @@ -2,13 +2,9 @@ error: incorrect unicode escape sequence --> $DIR/format-string-error-2.rs:77:20 | LL | println!("/x7B}/u8 {", 1); - | ^^ - | -help: format of unicode escape sequences is `/u{…}` - --> $DIR/format-string-error-2.rs:77:20 - | -LL | println!("/x7B}/u8 {", 1); - | ^^ + | ^^- + | | + | help: format of unicode escape sequences uses braces: `/u{8}` error: invalid format string: expected `'}'`, found `'a'` --> $DIR/format-string-error-2.rs:5:5 diff --git a/src/test/ui/parser/issue-23620-invalid-escapes.rs b/src/test/ui/parser/issue-23620-invalid-escapes.rs index 6895a926b4f..f8a2f1cc7e6 100644 --- a/src/test/ui/parser/issue-23620-invalid-escapes.rs +++ b/src/test/ui/parser/issue-23620-invalid-escapes.rs @@ -35,4 +35,7 @@ fn main() { //~^ ERROR invalid character in numeric character escape: //~^^ ERROR form of character escape may only be used with characters in the range [\x00-\x7f] //~^^^ ERROR incorrect unicode escape sequence + + let _ = "\u8f"; + //~^ ERROR incorrect unicode escape sequence } diff --git a/src/test/ui/parser/issue-23620-invalid-escapes.stderr b/src/test/ui/parser/issue-23620-invalid-escapes.stderr index b1a5764e891..025b392627d 100644 --- a/src/test/ui/parser/issue-23620-invalid-escapes.stderr +++ b/src/test/ui/parser/issue-23620-invalid-escapes.stderr @@ -118,5 +118,13 @@ help: format of unicode escape sequences is `/u{…}` LL | let _ = "/xf /u"; | ^^ -error: aborting due to 17 previous errors +error: incorrect unicode escape sequence + --> $DIR/issue-23620-invalid-escapes.rs:39:14 + | +LL | let _ = "/u8f"; + | ^^-- + | | + | help: format of unicode escape sequences uses braces: `/u{8f}` + +error: aborting due to 18 previous errors