Handle Spans for byte and raw strings and add more detail

This commit is contained in:
Esteban Küber 2021-01-23 12:48:31 -08:00
parent b81f5811f9
commit 3b5d018ebb
35 changed files with 279 additions and 184 deletions

View file

@ -14,7 +14,7 @@ mod tokentrees;
mod unescape_error_reporting; mod unescape_error_reporting;
mod unicode_chars; mod unicode_chars;
use unescape_error_reporting::{emit_unescape_error, push_escaped_char}; use unescape_error_reporting::{emit_unescape_error, escaped_char};
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct UnmatchedBrace { pub struct UnmatchedBrace {
@ -122,11 +122,9 @@ impl<'a> StringReader<'a> {
m: &str, m: &str,
c: char, c: char,
) -> DiagnosticBuilder<'a> { ) -> DiagnosticBuilder<'a> {
let mut m = m.to_string(); self.sess
m.push_str(": "); .span_diagnostic
push_escaped_char(&mut m, c); .struct_span_fatal(self.mk_sp(from_pos, to_pos), &format!("{}: {}", m, escaped_char(c)))
self.sess.span_diagnostic.struct_span_fatal(self.mk_sp(from_pos, to_pos), &m[..])
} }
/// Turns simple `rustc_lexer::TokenKind` enum into a rich /// Turns simple `rustc_lexer::TokenKind` enum into a rich
@ -421,7 +419,7 @@ impl<'a> StringReader<'a> {
let content_start = start + BytePos(prefix_len); let content_start = start + BytePos(prefix_len);
let content_end = suffix_start - BytePos(postfix_len); let content_end = suffix_start - BytePos(postfix_len);
let id = self.symbol_from_to(content_start, content_end); let id = self.symbol_from_to(content_start, content_end);
self.validate_literal_escape(mode, content_start, content_end); self.validate_literal_escape(mode, content_start, content_end, prefix_len, postfix_len);
(lit_kind, id) (lit_kind, id)
} }
@ -525,17 +523,29 @@ impl<'a> StringReader<'a> {
.raise(); .raise();
} }
fn validate_literal_escape(&self, mode: Mode, content_start: BytePos, content_end: BytePos) { fn validate_literal_escape(
&self,
mode: Mode,
content_start: BytePos,
content_end: BytePos,
prefix_len: u32,
postfix_len: u32,
) {
let lit_content = self.str_from_to(content_start, content_end); let lit_content = self.str_from_to(content_start, content_end);
unescape::unescape_literal(lit_content, mode, &mut |range, result| { unescape::unescape_literal(lit_content, mode, &mut |range, result| {
// Here we only check for errors. The actual unescaping is done later. // Here we only check for errors. The actual unescaping is done later.
if let Err(err) = result { if let Err(err) = result {
let span_with_quotes = let span_with_quotes = self
self.mk_sp(content_start - BytePos(1), content_end + BytePos(1)); .mk_sp(content_start - BytePos(prefix_len), content_end + BytePos(postfix_len));
let (start, end) = (range.start as u32, range.end as u32);
let lo = content_start + BytePos(start);
let hi = lo + BytePos(end - start);
let span = self.mk_sp(lo, hi);
emit_unescape_error( emit_unescape_error(
&self.sess.span_diagnostic, &self.sess.span_diagnostic,
lit_content, lit_content,
span_with_quotes, span_with_quotes,
span,
mode, mode,
range, range,
err, err,

View file

@ -13,6 +13,8 @@ pub(crate) fn emit_unescape_error(
lit: &str, lit: &str,
// full span of the literal, including quotes // full span of the literal, including quotes
span_with_quotes: Span, span_with_quotes: Span,
// interior span of the literal, without quotes
span: Span,
mode: Mode, mode: Mode,
// range of the error inside `lit` // range of the error inside `lit`
range: Range<usize>, range: Range<usize>,
@ -26,13 +28,6 @@ pub(crate) fn emit_unescape_error(
range, range,
error error
); );
let span = {
let Range { start, end } = range;
let (start, end) = (start as u32, end as u32);
let lo = span_with_quotes.lo() + BytePos(start + 1);
let hi = lo + BytePos(end - start);
span_with_quotes.with_lo(lo).with_hi(hi)
};
let last_char = || { let last_char = || {
let c = lit[range.clone()].chars().rev().next().unwrap(); let c = lit[range.clone()].chars().rev().next().unwrap();
let span = span.with_lo(span.hi() - BytePos(c.len_utf8() as u32)); let span = span.with_lo(span.hi() - BytePos(c.len_utf8() as u32));
@ -42,20 +37,22 @@ pub(crate) fn emit_unescape_error(
EscapeError::LoneSurrogateUnicodeEscape => { EscapeError::LoneSurrogateUnicodeEscape => {
handler handler
.struct_span_err(span, "invalid unicode character escape") .struct_span_err(span, "invalid unicode character escape")
.span_label(span, "invalid escape")
.help("unicode escape must not be a surrogate") .help("unicode escape must not be a surrogate")
.emit(); .emit();
} }
EscapeError::OutOfRangeUnicodeEscape => { EscapeError::OutOfRangeUnicodeEscape => {
handler handler
.struct_span_err(span, "invalid unicode character escape") .struct_span_err(span, "invalid unicode character escape")
.span_label(span, "invalid escape")
.help("unicode escape must be at most 10FFFF") .help("unicode escape must be at most 10FFFF")
.emit(); .emit();
} }
EscapeError::MoreThanOneChar => { EscapeError::MoreThanOneChar => {
let msg = if mode.is_bytes() { let (prefix, msg) = if mode.is_bytes() {
"if you meant to write a byte string literal, use double quotes" ("b", "if you meant to write a byte string literal, use double quotes")
} else { } else {
"if you meant to write a `str` literal, use double quotes" ("", "if you meant to write a `str` literal, use double quotes")
}; };
handler handler
@ -66,31 +63,44 @@ pub(crate) fn emit_unescape_error(
.span_suggestion( .span_suggestion(
span_with_quotes, span_with_quotes,
msg, msg,
format!("\"{}\"", lit), format!("{}\"{}\"", prefix, lit),
Applicability::MachineApplicable, Applicability::MachineApplicable,
) )
.emit(); .emit();
} }
EscapeError::EscapeOnlyChar => { EscapeError::EscapeOnlyChar => {
let (c, _span) = last_char(); let (c, char_span) = last_char();
let mut msg = if mode.is_bytes() { let msg = if mode.is_bytes() {
"byte constant must be escaped: " "byte constant must be escaped"
} else { } else {
"character constant must be escaped: " "character constant must be escaped"
} };
.to_string(); handler
push_escaped_char(&mut msg, c); .struct_span_err(span, &format!("{}: `{}`", msg, escaped_char(c)))
.span_suggestion(
handler.span_err(span, msg.as_str()) char_span,
"escape the character",
c.escape_default().to_string(),
Applicability::MachineApplicable,
)
.emit()
} }
EscapeError::BareCarriageReturn => { EscapeError::BareCarriageReturn => {
let msg = if mode.in_double_quotes() { let msg = if mode.in_double_quotes() {
"bare CR not allowed in string, use \\r instead" "bare CR not allowed in string, use `\\r` instead"
} else { } else {
"character constant must be escaped: \\r" "character constant must be escaped: `\\r`"
}; };
handler.span_err(span, msg); handler
.struct_span_err(span, msg)
.span_suggestion(
span,
"escape the character",
"\\r".to_string(),
Applicability::MachineApplicable,
)
.emit();
} }
EscapeError::BareCarriageReturnInRawString => { EscapeError::BareCarriageReturnInRawString => {
assert!(mode.in_double_quotes()); assert!(mode.in_double_quotes());
@ -102,21 +112,22 @@ pub(crate) fn emit_unescape_error(
let label = let label =
if mode.is_bytes() { "unknown byte escape" } else { "unknown character escape" }; if mode.is_bytes() { "unknown byte escape" } else { "unknown character escape" };
let mut msg = label.to_string(); let ec = escaped_char(c);
msg.push_str(": "); let mut diag = handler.struct_span_err(span, &format!("{}: `{}`", label, ec));
push_escaped_char(&mut msg, c);
let mut diag = handler.struct_span_err(span, msg.as_str());
diag.span_label(span, label); diag.span_label(span, label);
if c == '{' || c == '}' && !mode.is_bytes() { if c == '{' || c == '}' && !mode.is_bytes() {
diag.help( diag.help(
"if used in a formatting string, \ "if used in a formatting string, curly braces are escaped with `{{` and `}}`",
curly braces are escaped with `{{` and `}}`",
); );
} else if c == '\r' { } else if c == '\r' {
diag.help( diag.help(
"this is an isolated carriage return; \ "this is an isolated carriage return; consider checking your editor and \
consider checking your editor and version control settings", version control settings",
);
} else {
diag.help(
"for more information, visit \
<https://static.rust-lang.org/doc/master/reference.html#literals>",
); );
} }
diag.emit(); diag.emit();
@ -127,45 +138,70 @@ pub(crate) fn emit_unescape_error(
EscapeError::InvalidCharInHexEscape | EscapeError::InvalidCharInUnicodeEscape => { EscapeError::InvalidCharInHexEscape | EscapeError::InvalidCharInUnicodeEscape => {
let (c, span) = last_char(); let (c, span) = last_char();
let mut msg = if error == EscapeError::InvalidCharInHexEscape { let msg = if error == EscapeError::InvalidCharInHexEscape {
"invalid character in numeric character escape: " "invalid character in numeric character escape"
} else { } else {
"invalid character in unicode escape: " "invalid character in unicode escape"
} };
.to_string(); let c = escaped_char(c);
push_escaped_char(&mut msg, c);
handler.span_err(span, msg.as_str()) handler
.struct_span_err(span, &format!("{}: `{}`", msg, c))
.span_label(span, msg)
.emit();
} }
EscapeError::NonAsciiCharInByte => { EscapeError::NonAsciiCharInByte => {
assert!(mode.is_bytes()); assert!(mode.is_bytes());
let (_c, span) = last_char(); let (c, span) = last_char();
handler.span_err( handler
span, .struct_span_err(span, "non-ASCII character in byte constant")
"byte constant must be ASCII. \ .span_label(span, "byte constant must be ASCII")
Use a \\xHH escape for a non-ASCII byte", .span_suggestion(
) span,
"use a \\xHH escape for a non-ASCII byte",
format!("\\x{:X}", c as u32),
Applicability::MachineApplicable,
)
.emit();
} }
EscapeError::NonAsciiCharInByteString => { EscapeError::NonAsciiCharInByteString => {
assert!(mode.is_bytes()); assert!(mode.is_bytes());
let (_c, span) = last_char(); let (_c, span) = last_char();
handler.span_err(span, "raw byte string must be ASCII") handler
.struct_span_err(span, "raw byte string must be ASCII")
.span_label(span, "must be ASCII")
.emit();
}
EscapeError::OutOfRangeHexEscape => {
handler
.struct_span_err(span, "out of range hex escape")
.span_label(span, "must be a character in the range [\\x00-\\x7f]")
.emit();
} }
EscapeError::OutOfRangeHexEscape => handler.span_err(
span,
"this form of character escape may only be used \
with characters in the range [\\x00-\\x7f]",
),
EscapeError::LeadingUnderscoreUnicodeEscape => { EscapeError::LeadingUnderscoreUnicodeEscape => {
let (_c, span) = last_char(); let (c, span) = last_char();
handler.span_err(span, "invalid start of unicode escape") let msg = "invalid start of unicode escape";
handler
.struct_span_err(span, &format!("{}: `{}`", msg, c))
.span_label(span, msg)
.emit();
} }
EscapeError::OverlongUnicodeEscape => { EscapeError::OverlongUnicodeEscape => {
handler.span_err(span, "overlong unicode escape (must have at most 6 hex digits)") handler
} .struct_span_err(span, "overlong unicode escape")
EscapeError::UnclosedUnicodeEscape => { .span_label(span, "must have at most 6 hex digits")
handler.span_err(span, "unterminated unicode escape (needed a `}`)") .emit();
} }
EscapeError::UnclosedUnicodeEscape => handler
.struct_span_err(span, "unterminated unicode escape")
.span_label(span, "missing a closing `}`")
.span_suggestion_verbose(
span.shrink_to_hi(),
"terminate the unicode escape",
"}".to_string(),
Applicability::MaybeIncorrect,
)
.emit(),
EscapeError::NoBraceInUnicodeEscape => { EscapeError::NoBraceInUnicodeEscape => {
let msg = "incorrect unicode escape sequence"; let msg = "incorrect unicode escape sequence";
let mut diag = handler.struct_span_err(span, msg); let mut diag = handler.struct_span_err(span, msg);
@ -195,28 +231,38 @@ pub(crate) fn emit_unescape_error(
diag.emit(); diag.emit();
} }
EscapeError::UnicodeEscapeInByte => handler.span_err( EscapeError::UnicodeEscapeInByte => {
span, let msg = "unicode escape in byte string";
"unicode escape sequences cannot be used \ handler
as a byte or in a byte string", .struct_span_err(span, msg)
), .span_label(span, msg)
EscapeError::EmptyUnicodeEscape => { .help("unicode escape sequences cannot be used as a byte or in a byte string")
handler.span_err(span, "empty unicode escape (must have at least 1 hex digit)") .emit();
}
EscapeError::EmptyUnicodeEscape => {
handler
.struct_span_err(span, "empty unicode escape")
.span_label(span, "this escape must have at least 1 hex digit")
.emit();
}
EscapeError::ZeroChars => {
let msg = "empty character literal";
handler.struct_span_err(span, msg).span_label(span, msg).emit()
}
EscapeError::LoneSlash => {
let msg = "invalid trailing slash in literal";
handler.struct_span_err(span, msg).span_label(span, msg).emit();
} }
EscapeError::ZeroChars => handler.span_err(span, "empty character literal"),
EscapeError::LoneSlash => handler.span_err(span, "invalid trailing slash in literal"),
} }
} }
/// Pushes a character to a message string for error reporting /// Pushes a character to a message string for error reporting
pub(crate) fn push_escaped_char(msg: &mut String, c: char) { pub(crate) fn escaped_char(c: char) -> String {
match c { match c {
'\u{20}'..='\u{7e}' => { '\u{20}'..='\u{7e}' => {
// Don't escape \, ' or " for user-facing messages // Don't escape \, ' or " for user-facing messages
msg.push(c); c.to_string()
}
_ => {
msg.extend(c.escape_default());
} }
_ => c.escape_default().to_string(),
} }
} }

View file

@ -1,4 +1,4 @@
#![feature(rustc_attrs)] #![feature(rustc_attrs)]
#[rustc_dummy = b"ffi.rs"] //~ ERROR byte constant must be ASCII #[rustc_dummy = b"ffi.rs"] //~ ERROR non-ASCII character in byte constant
fn main() {} fn main() {}

View file

@ -1,8 +1,11 @@
error: byte constant must be ASCII. Use a \xHH escape for a non-ASCII byte error: non-ASCII character in byte constant
--> $DIR/key-value-non-ascii.rs:3:19 --> $DIR/key-value-non-ascii.rs:3:19
| |
LL | #[rustc_dummy = b"ffi.rs"] LL | #[rustc_dummy = b"ffi.rs"]
| ^ | ^
| |
| byte constant must be ASCII
| help: use a \xHH escape for a non-ASCII byte: `\xFB03`
error: aborting due to previous error error: aborting due to previous error

View file

@ -1,6 +1,6 @@
fn main() { fn main() {
let x = "\x80"; //~ ERROR may only be used let x = "\x80"; //~ ERROR out of range hex escape
let y = "\xff"; //~ ERROR may only be used let y = "\xff"; //~ ERROR out of range hex escape
let z = "\xe2"; //~ ERROR may only be used let z = "\xe2"; //~ ERROR out of range hex escape
let a = b"\x00e2"; // ok because byte literal let a = b"\x00e2"; // ok because byte literal
} }

View file

@ -1,20 +1,20 @@
error: this form of character escape may only be used with characters in the range [\x00-\x7f] error: out of range hex escape
--> $DIR/ascii-only-character-escape.rs:2:14 --> $DIR/ascii-only-character-escape.rs:2:14
| |
LL | let x = "\x80"; LL | let x = "\x80";
| ^^^^ | ^^^^ must be a character in the range [\x00-\x7f]
error: this form of character escape may only be used with characters in the range [\x00-\x7f] error: out of range hex escape
--> $DIR/ascii-only-character-escape.rs:3:14 --> $DIR/ascii-only-character-escape.rs:3:14
| |
LL | let y = "\xff"; LL | let y = "\xff";
| ^^^^ | ^^^^ must be a character in the range [\x00-\x7f]
error: this form of character escape may only be used with characters in the range [\x00-\x7f] error: out of range hex escape
--> $DIR/ascii-only-character-escape.rs:4:14 --> $DIR/ascii-only-character-escape.rs:4:14
| |
LL | let z = "\xe2"; LL | let z = "\xe2";
| ^^^^ | ^^^^ must be a character in the range [\x00-\x7f]
error: aborting due to 3 previous errors error: aborting due to 3 previous errors

View file

@ -4,17 +4,17 @@
fn main() { fn main() {
// these literals are just silly. // these literals are just silly.
'''; ''';
//~^ ERROR: character constant must be escaped: ' //~^ ERROR: character constant must be escaped: `'`
// note that this is a literal "\n" byte // note that this is a literal "\n" byte
' '
'; ';
//~^^ ERROR: character constant must be escaped: \n //~^^ ERROR: character constant must be escaped: `\n`
// note that this is a literal "\r" byte // note that this is a literal "\r" byte
' '; //~ ERROR: character constant must be escaped: \r ' '; //~ ERROR: character constant must be escaped: `\r`
// note that this is a literal tab character here // note that this is a literal tab character here
' '; ' ';
//~^ ERROR: character constant must be escaped: \t //~^ ERROR: character constant must be escaped: `\t`
} }

View file

@ -1,28 +1,28 @@
error: character constant must be escaped: ' error: character constant must be escaped: `'`
--> $DIR/bad-char-literals.rs:6:6 --> $DIR/bad-char-literals.rs:6:6
| |
LL | '''; LL | ''';
| ^ | ^ help: escape the character: `\'`
error: character constant must be escaped: \n error: character constant must be escaped: `\n`
--> $DIR/bad-char-literals.rs:10:6 --> $DIR/bad-char-literals.rs:10:6
| |
LL | ' LL | '
| ______^ | ______^
LL | | '; LL | | ';
| |_ | |_ help: escape the character: `\n`
error: character constant must be escaped: \r error: character constant must be escaped: `\r`
--> $DIR/bad-char-literals.rs:15:6 --> $DIR/bad-char-literals.rs:15:6
| |
LL | ' '; LL | ' ';
| ^ | ^ help: escape the character: `\r`
error: character constant must be escaped: \t error: character constant must be escaped: `\t`
--> $DIR/bad-char-literals.rs:18:6 --> $DIR/bad-char-literals.rs:18:6
| |
LL | ' '; LL | ' ';
| ^^^^ | ^^^^ help: escape the character: `\t`
error: aborting due to 4 previous errors error: aborting due to 4 previous errors

View file

@ -4,9 +4,9 @@ static FOO: u8 = b'\f'; //~ ERROR unknown byte escape
pub fn main() { pub fn main() {
b'\f'; //~ ERROR unknown byte escape b'\f'; //~ ERROR unknown byte escape
b'\x0Z'; //~ ERROR invalid character in numeric character escape: Z b'\x0Z'; //~ ERROR invalid character in numeric character escape: `Z`
b' '; //~ ERROR byte constant must be escaped b' '; //~ ERROR byte constant must be escaped
b'''; //~ ERROR byte constant must be escaped b'''; //~ ERROR byte constant must be escaped
b'é'; //~ ERROR byte constant must be ASCII b'é'; //~ ERROR non-ASCII character in byte constant
b'a //~ ERROR unterminated byte constant [E0763] b'a //~ ERROR unterminated byte constant [E0763]
} }

View file

@ -1,38 +1,45 @@
error: unknown byte escape: f error: unknown byte escape: `f`
--> $DIR/byte-literals.rs:3:21 --> $DIR/byte-literals.rs:3:21
| |
LL | static FOO: u8 = b'\f'; LL | static FOO: u8 = b'\f';
| ^ unknown byte escape | ^ unknown byte escape
|
= help: for more information, visit <https://static.rust-lang.org/doc/master/reference.html#literals>
error: unknown byte escape: f error: unknown byte escape: `f`
--> $DIR/byte-literals.rs:6:8 --> $DIR/byte-literals.rs:6:8
| |
LL | b'\f'; LL | b'\f';
| ^ unknown byte escape | ^ unknown byte escape
|
= help: for more information, visit <https://static.rust-lang.org/doc/master/reference.html#literals>
error: invalid character in numeric character escape: Z error: invalid character in numeric character escape: `Z`
--> $DIR/byte-literals.rs:7:10 --> $DIR/byte-literals.rs:7:10
| |
LL | b'\x0Z'; LL | b'\x0Z';
| ^ | ^ invalid character in numeric character escape
error: byte constant must be escaped: \t error: byte constant must be escaped: `\t`
--> $DIR/byte-literals.rs:8:7 --> $DIR/byte-literals.rs:8:7
| |
LL | b' '; LL | b' ';
| ^^^^ | ^^^^ help: escape the character: `\t`
error: byte constant must be escaped: ' error: byte constant must be escaped: `'`
--> $DIR/byte-literals.rs:9:7 --> $DIR/byte-literals.rs:9:7
| |
LL | b'''; LL | b''';
| ^ | ^ help: escape the character: `\'`
error: byte constant must be ASCII. Use a \xHH escape for a non-ASCII byte error: non-ASCII character in byte constant
--> $DIR/byte-literals.rs:10:7 --> $DIR/byte-literals.rs:10:7
| |
LL | b'é'; LL | b'é';
| ^ | ^
| |
| byte constant must be ASCII
| help: use a \xHH escape for a non-ASCII byte: `\xE9`
error[E0763]: unterminated byte constant error[E0763]: unterminated byte constant
--> $DIR/byte-literals.rs:11:6 --> $DIR/byte-literals.rs:11:6

View file

@ -2,7 +2,8 @@ static FOO: &'static [u8] = b"\f"; //~ ERROR unknown byte escape
pub fn main() { pub fn main() {
b"\f"; //~ ERROR unknown byte escape b"\f"; //~ ERROR unknown byte escape
b"\x0Z"; //~ ERROR invalid character in numeric character escape: Z b"\x0Z"; //~ ERROR invalid character in numeric character escape: `Z`
b"é"; //~ ERROR byte constant must be ASCII b"é"; //~ ERROR non-ASCII character in byte constant
br##"é"##; //~ ERROR raw byte string must be ASCII
b"a //~ ERROR unterminated double quote byte string b"a //~ ERROR unterminated double quote byte string
} }

View file

@ -1,35 +1,48 @@
error: unknown byte escape: f error: unknown byte escape: `f`
--> $DIR/byte-string-literals.rs:1:32 --> $DIR/byte-string-literals.rs:1:32
| |
LL | static FOO: &'static [u8] = b"\f"; LL | static FOO: &'static [u8] = b"\f";
| ^ unknown byte escape | ^ unknown byte escape
|
= help: for more information, visit <https://static.rust-lang.org/doc/master/reference.html#literals>
error: unknown byte escape: f error: unknown byte escape: `f`
--> $DIR/byte-string-literals.rs:4:8 --> $DIR/byte-string-literals.rs:4:8
| |
LL | b"\f"; LL | b"\f";
| ^ unknown byte escape | ^ unknown byte escape
|
= help: for more information, visit <https://static.rust-lang.org/doc/master/reference.html#literals>
error: invalid character in numeric character escape: Z error: invalid character in numeric character escape: `Z`
--> $DIR/byte-string-literals.rs:5:10 --> $DIR/byte-string-literals.rs:5:10
| |
LL | b"\x0Z"; LL | b"\x0Z";
| ^ | ^ invalid character in numeric character escape
error: byte constant must be ASCII. Use a \xHH escape for a non-ASCII byte error: non-ASCII character in byte constant
--> $DIR/byte-string-literals.rs:6:7 --> $DIR/byte-string-literals.rs:6:7
| |
LL | b"é"; LL | b"é";
| ^ | ^
| |
| byte constant must be ASCII
| help: use a \xHH escape for a non-ASCII byte: `\xE9`
error: raw byte string must be ASCII
--> $DIR/byte-string-literals.rs:7:10
|
LL | br##"é"##;
| ^ must be ASCII
error[E0766]: unterminated double quote byte string error[E0766]: unterminated double quote byte string
--> $DIR/byte-string-literals.rs:7:6 --> $DIR/byte-string-literals.rs:8:6
| |
LL | b"a LL | b"a
| ______^ | ______^
LL | | } LL | | }
| |__^ | |__^
error: aborting due to 5 previous errors error: aborting due to 6 previous errors
For more information about this error, try `rustc --explain E0766`. For more information about this error, try `rustc --explain E0766`.

View file

@ -1,9 +1,9 @@
fn main() { fn main() {
let _ = b"\u{a66e}"; let _ = b"\u{a66e}";
//~^ ERROR unicode escape sequences cannot be used as a byte or in a byte string //~^ ERROR unicode escape in byte string
let _ = b'\u{a66e}'; let _ = b'\u{a66e}';
//~^ ERROR unicode escape sequences cannot be used as a byte or in a byte string //~^ ERROR unicode escape in byte string
let _ = b'\u'; let _ = b'\u';
//~^ ERROR incorrect unicode escape sequence //~^ ERROR incorrect unicode escape sequence
@ -12,21 +12,21 @@ fn main() {
//~^ ERROR numeric character escape is too short //~^ ERROR numeric character escape is too short
let _ = b'\xxy'; let _ = b'\xxy';
//~^ ERROR invalid character in numeric character escape: x //~^ ERROR invalid character in numeric character escape: `x`
let _ = '\x5'; let _ = '\x5';
//~^ ERROR numeric character escape is too short //~^ ERROR numeric character escape is too short
let _ = '\xxy'; let _ = '\xxy';
//~^ ERROR invalid character in numeric character escape: x //~^ ERROR invalid character in numeric character escape: `x`
let _ = b"\u{a4a4} \xf \u"; let _ = b"\u{a4a4} \xf \u";
//~^ ERROR unicode escape sequences cannot be used as a byte or in a byte string //~^ ERROR unicode escape in byte string
//~^^ ERROR invalid character in numeric character escape: //~^^ ERROR invalid character in numeric character escape: ` `
//~^^^ ERROR incorrect unicode escape sequence //~^^^ ERROR incorrect unicode escape sequence
let _ = "\xf \u"; let _ = "\xf \u";
//~^ ERROR invalid character in numeric character escape: //~^ ERROR invalid character in numeric character escape: ` `
//~^^ ERROR incorrect unicode escape sequence //~^^ ERROR incorrect unicode escape sequence
let _ = "\u8f"; let _ = "\u8f";

View file

@ -1,14 +1,18 @@
error: unicode escape sequences cannot be used as a byte or in a byte string error: unicode escape in byte string
--> $DIR/issue-23620-invalid-escapes.rs:2:15 --> $DIR/issue-23620-invalid-escapes.rs:2:15
| |
LL | let _ = b"\u{a66e}"; LL | let _ = b"\u{a66e}";
| ^^^^^^^^ | ^^^^^^^^ unicode escape in byte string
|
= help: unicode escape sequences cannot be used as a byte or in a byte string
error: unicode escape sequences cannot be used as a byte or in a byte string error: unicode escape in byte string
--> $DIR/issue-23620-invalid-escapes.rs:5:15 --> $DIR/issue-23620-invalid-escapes.rs:5:15
| |
LL | let _ = b'\u{a66e}'; LL | let _ = b'\u{a66e}';
| ^^^^^^^^ | ^^^^^^^^ unicode escape in byte string
|
= help: unicode escape sequences cannot be used as a byte or in a byte string
error: incorrect unicode escape sequence error: incorrect unicode escape sequence
--> $DIR/issue-23620-invalid-escapes.rs:8:15 --> $DIR/issue-23620-invalid-escapes.rs:8:15
@ -24,11 +28,11 @@ error: numeric character escape is too short
LL | let _ = b'\x5'; LL | let _ = b'\x5';
| ^^^ | ^^^
error: invalid character in numeric character escape: x error: invalid character in numeric character escape: `x`
--> $DIR/issue-23620-invalid-escapes.rs:14:17 --> $DIR/issue-23620-invalid-escapes.rs:14:17
| |
LL | let _ = b'\xxy'; LL | let _ = b'\xxy';
| ^ | ^ invalid character in numeric character escape
error: numeric character escape is too short error: numeric character escape is too short
--> $DIR/issue-23620-invalid-escapes.rs:17:14 --> $DIR/issue-23620-invalid-escapes.rs:17:14
@ -36,23 +40,25 @@ error: numeric character escape is too short
LL | let _ = '\x5'; LL | let _ = '\x5';
| ^^^ | ^^^
error: invalid character in numeric character escape: x error: invalid character in numeric character escape: `x`
--> $DIR/issue-23620-invalid-escapes.rs:20:16 --> $DIR/issue-23620-invalid-escapes.rs:20:16
| |
LL | let _ = '\xxy'; LL | let _ = '\xxy';
| ^ | ^ invalid character in numeric character escape
error: unicode escape sequences cannot be used as a byte or in a byte string error: unicode escape in byte string
--> $DIR/issue-23620-invalid-escapes.rs:23:15 --> $DIR/issue-23620-invalid-escapes.rs:23:15
| |
LL | let _ = b"\u{a4a4} \xf \u"; LL | let _ = b"\u{a4a4} \xf \u";
| ^^^^^^^^ | ^^^^^^^^ unicode escape in byte string
|
= help: unicode escape sequences cannot be used as a byte or in a byte string
error: invalid character in numeric character escape: error: invalid character in numeric character escape: ` `
--> $DIR/issue-23620-invalid-escapes.rs:23:27 --> $DIR/issue-23620-invalid-escapes.rs:23:27
| |
LL | let _ = b"\u{a4a4} \xf \u"; LL | let _ = b"\u{a4a4} \xf \u";
| ^ | ^ invalid character in numeric character escape
error: incorrect unicode escape sequence error: incorrect unicode escape sequence
--> $DIR/issue-23620-invalid-escapes.rs:23:28 --> $DIR/issue-23620-invalid-escapes.rs:23:28
@ -62,11 +68,11 @@ LL | let _ = b"\u{a4a4} \xf \u";
| |
= help: format of unicode escape sequences is `\u{...}` = help: format of unicode escape sequences is `\u{...}`
error: invalid character in numeric character escape: error: invalid character in numeric character escape: ` `
--> $DIR/issue-23620-invalid-escapes.rs:28:17 --> $DIR/issue-23620-invalid-escapes.rs:28:17
| |
LL | let _ = "\xf \u"; LL | let _ = "\xf \u";
| ^ | ^ invalid character in numeric character escape
error: incorrect unicode escape sequence error: incorrect unicode escape sequence
--> $DIR/issue-23620-invalid-escapes.rs:28:18 --> $DIR/issue-23620-invalid-escapes.rs:28:18

View file

@ -1,8 +1,8 @@
error: invalid start of unicode escape error: invalid start of unicode escape: `_`
--> $DIR/issue-43692.rs:2:9 --> $DIR/issue-43692.rs:2:9
| |
LL | '\u{_10FFFF}'; LL | '\u{_10FFFF}';
| ^ | ^ invalid start of unicode escape
error: aborting due to previous error error: aborting due to previous error

View file

@ -10,7 +10,7 @@ error: invalid trailing slash in literal
--> $DIR/issue-62913.rs:1:5 --> $DIR/issue-62913.rs:1:5
| |
LL | "\u\" LL | "\u\"
| ^ | ^ invalid trailing slash in literal
error: expected item, found `"\u\"` error: expected item, found `"\u\"`
--> $DIR/issue-62913.rs:1:1 --> $DIR/issue-62913.rs:1:1

View file

@ -1,13 +1,13 @@
error: character literal may only contain one codepoint error: character literal may only contain one codepoint
--> $DIR/issue-64732.rs:3:17 --> $DIR/issue-64732.rs:3:16
| |
LL | let _foo = b'hello\0'; LL | let _foo = b'hello\0';
| ^^^^^^^^^ | ^^^^^^^^^^
| |
help: if you meant to write a byte string literal, use double quotes help: if you meant to write a byte string literal, use double quotes
| |
LL | let _foo = b"hello\0"; LL | let _foo = b"hello\0";
| ^^^^^^^^^ | ^^^^^^^^^^
error: character literal may only contain one codepoint error: character literal may only contain one codepoint
--> $DIR/issue-64732.rs:6:16 --> $DIR/issue-64732.rs:6:16

View file

@ -10,17 +10,21 @@ error: numeric character escape is too short
LL | "\x1" LL | "\x1"
| ^^^ | ^^^
error: unknown character escape: \u{25cf} error: unknown character escape: `\u{25cf}`
--> $DIR/lex-bad-char-literals-1.rs:10:7 --> $DIR/lex-bad-char-literals-1.rs:10:7
| |
LL | '\●' LL | '\●'
| ^ unknown character escape | ^ unknown character escape
|
= help: for more information, visit <https://static.rust-lang.org/doc/master/reference.html#literals>
error: unknown character escape: \u{25cf} error: unknown character escape: `\u{25cf}`
--> $DIR/lex-bad-char-literals-1.rs:14:7 --> $DIR/lex-bad-char-literals-1.rs:14:7
| |
LL | "\●" LL | "\●"
| ^ unknown character escape | ^ unknown character escape
|
= help: for more information, visit <https://static.rust-lang.org/doc/master/reference.html#literals>
error: aborting due to 4 previous errors error: aborting due to 4 previous errors

View file

@ -2,7 +2,7 @@ fn main() {
let _: char = ''; let _: char = '';
//~^ ERROR: empty character literal //~^ ERROR: empty character literal
let _: char = '\u{}'; let _: char = '\u{}';
//~^ ERROR: empty unicode escape (must have at least 1 hex digit) //~^ ERROR: empty unicode escape
// Next two are OK, but may befool error recovery // Next two are OK, but may befool error recovery
let _ = '/'; let _ = '/';

View file

@ -2,13 +2,13 @@ error: empty character literal
--> $DIR/lex-bad-char-literals-7.rs:2:20 --> $DIR/lex-bad-char-literals-7.rs:2:20
| |
LL | let _: char = ''; LL | let _: char = '';
| ^ | ^ empty character literal
error: empty unicode escape (must have at least 1 hex digit) error: empty unicode escape
--> $DIR/lex-bad-char-literals-7.rs:4:20 --> $DIR/lex-bad-char-literals-7.rs:4:20
| |
LL | let _: char = '\u{}'; LL | let _: char = '\u{}';
| ^^^^ | ^^^^ this escape must have at least 1 hex digit
error[E0762]: unterminated character literal error[E0762]: unterminated character literal
--> $DIR/lex-bad-char-literals-7.rs:11:13 --> $DIR/lex-bad-char-literals-7.rs:11:13

View file

@ -22,5 +22,5 @@ fn main() {
let _s = r"bar foo"; //~ ERROR: bare CR not allowed in raw string let _s = r"bar foo"; //~ ERROR: bare CR not allowed in raw string
// the following string literal has a bare CR in it // the following string literal has a bare CR in it
let _s = "foo\ bar"; //~ ERROR: unknown character escape: \r let _s = "foo\ bar"; //~ ERROR: unknown character escape: `\r`
} }

View file

@ -22,11 +22,11 @@ error: bare CR not allowed in block doc-comment
LL | /*! block doc comment with bare CR: ' ' */ LL | /*! block doc comment with bare CR: ' ' */
| ^ | ^
error: bare CR not allowed in string, use \r instead error: bare CR not allowed in string, use `\r` instead
--> $DIR/lex-bare-cr-string-literal-doc-comment.rs:19:18 --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:19:18
| |
LL | let _s = "foo bar"; LL | let _s = "foo bar";
| ^ | ^ help: escape the character: `\r`
error: bare CR not allowed in raw string error: bare CR not allowed in raw string
--> $DIR/lex-bare-cr-string-literal-doc-comment.rs:22:19 --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:22:19
@ -34,7 +34,7 @@ error: bare CR not allowed in raw string
LL | let _s = r"bar foo"; LL | let _s = r"bar foo";
| ^ | ^
error: unknown character escape: \r error: unknown character escape: `\r`
--> $DIR/lex-bare-cr-string-literal-doc-comment.rs:25:19 --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:25:19
| |
LL | let _s = "foo\ bar"; LL | let _s = "foo\ bar";

View file

@ -2,7 +2,7 @@ error: invalid unicode character escape
--> $DIR/literals-are-validated-before-expansion.rs:6:20 --> $DIR/literals-are-validated-before-expansion.rs:6:20
| |
LL | black_hole! { '\u{FFFFFF}' } LL | black_hole! { '\u{FFFFFF}' }
| ^^^^^^^^^^ | ^^^^^^^^^^ invalid escape
| |
= help: unicode escape must be at most 10FFFF = help: unicode escape must be at most 10FFFF
@ -10,7 +10,7 @@ error: invalid unicode character escape
--> $DIR/literals-are-validated-before-expansion.rs:8:39 --> $DIR/literals-are-validated-before-expansion.rs:8:39
| |
LL | black_hole! { "this is surrogate: \u{DAAA}" } LL | black_hole! { "this is surrogate: \u{DAAA}" }
| ^^^^^^^^ | ^^^^^^^^ invalid escape
| |
= help: unicode escape must not be a surrogate = help: unicode escape must not be a surrogate

View file

@ -1,3 +1,3 @@
pub fn main() { pub fn main() {
let s = "\u{2603"; //~ ERROR unterminated unicode escape (needed a `}`) let s = "\u{2603"; //~ ERROR unterminated unicode escape
} }

View file

@ -1,8 +1,13 @@
error: unterminated unicode escape (needed a `}`) error: unterminated unicode escape
--> $DIR/new-unicode-escapes-1.rs:2:14 --> $DIR/new-unicode-escapes-1.rs:2:14
| |
LL | let s = "\u{2603"; LL | let s = "\u{2603";
| ^^^^^^^ | ^^^^^^^ missing a closing `}`
|
help: terminate the unicode escape
|
LL | let s = "\u{2603}";
| ^
error: aborting due to previous error error: aborting due to previous error

View file

@ -1,3 +1,3 @@
pub fn main() { pub fn main() {
let s = "\u{260311111111}"; //~ ERROR overlong unicode escape (must have at most 6 hex digits) let s = "\u{260311111111}"; //~ ERROR overlong unicode escape
} }

View file

@ -1,8 +1,8 @@
error: overlong unicode escape (must have at most 6 hex digits) error: overlong unicode escape
--> $DIR/new-unicode-escapes-2.rs:2:14 --> $DIR/new-unicode-escapes-2.rs:2:14
| |
LL | let s = "\u{260311111111}"; LL | let s = "\u{260311111111}";
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^ must have at most 6 hex digits
error: aborting due to previous error error: aborting due to previous error

View file

@ -2,7 +2,7 @@ error: invalid unicode character escape
--> $DIR/new-unicode-escapes-3.rs:2:15 --> $DIR/new-unicode-escapes-3.rs:2:15
| |
LL | let s1 = "\u{d805}"; LL | let s1 = "\u{d805}";
| ^^^^^^^^ | ^^^^^^^^ invalid escape
| |
= help: unicode escape must not be a surrogate = help: unicode escape must not be a surrogate
@ -10,7 +10,7 @@ error: invalid unicode character escape
--> $DIR/new-unicode-escapes-3.rs:3:15 --> $DIR/new-unicode-escapes-3.rs:3:15
| |
LL | let s2 = "\u{ffffff}"; LL | let s2 = "\u{ffffff}";
| ^^^^^^^^^^ | ^^^^^^^^^^ invalid escape
| |
= help: unicode escape must be at most 10FFFF = help: unicode escape must be at most 10FFFF

View file

@ -1,4 +1,4 @@
pub fn main() { pub fn main() {
let s = "\u{lol}"; let s = "\u{lol}";
//~^ ERROR invalid character in unicode escape: l //~^ ERROR invalid character in unicode escape: `l`
} }

View file

@ -1,8 +1,8 @@
error: invalid character in unicode escape: l error: invalid character in unicode escape: `l`
--> $DIR/new-unicode-escapes-4.rs:2:17 --> $DIR/new-unicode-escapes-4.rs:2:17
| |
LL | let s = "\u{lol}"; LL | let s = "\u{lol}";
| ^ | ^ invalid character in unicode escape
error: aborting due to previous error error: aborting due to previous error

View file

@ -8,7 +8,7 @@ error: raw byte string must be ASCII
--> $DIR/raw-byte-string-literals.rs:5:8 --> $DIR/raw-byte-string-literals.rs:5:8
| |
LL | br"é"; LL | br"é";
| ^ | ^ must be ASCII
error: found invalid character; only `#` is allowed in raw string delimitation: ~ error: found invalid character; only `#` is allowed in raw string delimitation: ~
--> $DIR/raw-byte-string-literals.rs:6:5 --> $DIR/raw-byte-string-literals.rs:6:5

View file

@ -8,7 +8,7 @@ fn main() {
a test"; a test";
// \r only // \r only
let bad = "This is \ a test"; let bad = "This is \ a test";
//~^ ERROR unknown character escape: \r //~^ ERROR unknown character escape: `\r`
//~^^ HELP this is an isolated carriage return //~| HELP this is an isolated carriage return
} }

View file

@ -1,4 +1,4 @@
error: unknown character escape: \r error: unknown character escape: `\r`
--> $DIR/trailing-carriage-return-in-string.rs:10:25 --> $DIR/trailing-carriage-return-in-string.rs:10:25
| |
LL | let bad = "This is \ a test"; LL | let bad = "This is \ a test";

View file

@ -1,8 +1,8 @@
fn main() { fn main() {
let ok = "{{everything fine}}"; let ok = "{{everything fine}}";
let bad = "\{it is wrong\}"; let bad = "\{it is wrong\}";
//~^ ERROR unknown character escape: { //~^ ERROR unknown character escape: `{`
//~^^ HELP if used in a formatting string, curly braces are escaped with `{{` and `}}` //~| HELP if used in a formatting string, curly braces are escaped with `{{` and `}}`
//~^^^ ERROR unknown character escape: } //~| ERROR unknown character escape: `}`
//~^^^^ HELP if used in a formatting string, curly braces are escaped with `{{` and `}}` //~| HELP if used in a formatting string, curly braces are escaped with `{{` and `}}`
} }

View file

@ -1,4 +1,4 @@
error: unknown character escape: { error: unknown character escape: `{`
--> $DIR/wrong-escape-of-curly-braces.rs:3:17 --> $DIR/wrong-escape-of-curly-braces.rs:3:17
| |
LL | let bad = "\{it is wrong\}"; LL | let bad = "\{it is wrong\}";
@ -6,7 +6,7 @@ LL | let bad = "\{it is wrong\}";
| |
= help: if used in a formatting string, curly braces are escaped with `{{` and `}}` = help: if used in a formatting string, curly braces are escaped with `{{` and `}}`
error: unknown character escape: } error: unknown character escape: `}`
--> $DIR/wrong-escape-of-curly-braces.rs:3:30 --> $DIR/wrong-escape-of-curly-braces.rs:3:30
| |
LL | let bad = "\{it is wrong\}"; LL | let bad = "\{it is wrong\}";