about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorAleksey Kladov <aleksey.kladov@gmail.com>2019-05-02 20:56:07 +0300
committerAleksey Kladov <aleksey.kladov@gmail.com>2019-05-02 21:01:02 +0300
commit1835cbeb6574997ec5188cb22b9538c61976d2b4 (patch)
treebe4b47724ddef3bfd294597d1072a40dabb8ef3c /src/libsyntax/parse
parentbfa5f278472d0bad4e7db4a4259b2f1fa97ca0ab (diff)
downloadrust-1835cbeb6574997ec5188cb22b9538c61976d2b4.tar.gz
rust-1835cbeb6574997ec5188cb22b9538c61976d2b4.zip
don't amplify errors in format! with bad literals
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/mod.rs21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs
index d6d4f8e8f04..34a86bab229 100644
--- a/src/libsyntax/parse/mod.rs
+++ b/src/libsyntax/parse/mod.rs
@@ -33,7 +33,7 @@ pub mod attr;
 pub mod classify;
 
 pub(crate) mod unescape;
-use unescape::{unescape_str, unescape_char, unescape_byte_str, unescape_byte, EscapeError};
+use unescape::{unescape_str, unescape_char, unescape_byte_str, unescape_byte};
 
 pub(crate) mod unescape_error_reporting;
 
@@ -355,16 +355,14 @@ crate fn lit_token(lit: token::Lit, suf: Option<Symbol>, diag: Option<(Span, &Ha
         token::Byte(i) => {
             let lit_kind = match unescape_byte(&i.as_str()) {
                 Ok(c) => LitKind::Byte(c),
-                Err((_, EscapeError::MoreThanOneChar)) => LitKind::Err(i),
-                Err(_) => LitKind::Byte(0),
+                Err(_) => LitKind::Err(i),
             };
             (true, Some(lit_kind))
         },
         token::Char(i) => {
             let lit_kind = match unescape_char(&i.as_str()) {
                 Ok(c) => LitKind::Char(c),
-                Err((_, EscapeError::MoreThanOneChar)) => LitKind::Err(i),
-                Err(_) => LitKind::Char('\u{FFFD}'),
+                Err(_) => LitKind::Err(i),
             };
             (true, Some(lit_kind))
         },
@@ -380,17 +378,22 @@ crate fn lit_token(lit: token::Lit, suf: Option<Symbol>, diag: Option<(Span, &Ha
             // reuse the symbol from the Token. Otherwise, we must generate a
             // new symbol because the string in the LitKind is different to the
             // string in the Token.
+            let mut has_error = false;
             let s = &sym.as_str();
             if s.as_bytes().iter().any(|&c| c == b'\\' || c == b'\r') {
                 let mut buf = String::with_capacity(s.len());
                 unescape_str(s, &mut |_, unescaped_char| {
                     match unescaped_char {
                         Ok(c) => buf.push(c),
-                        Err(_) => buf.push('\u{FFFD}'),
+                        Err(_) => has_error = true,
                     }
                 });
+                if has_error {
+                    return (true, Some(LitKind::Err(sym)));
+                }
                 sym = Symbol::intern(&buf)
             }
+
             (true, Some(LitKind::Str(sym, ast::StrStyle::Cooked)))
         }
         token::StrRaw(mut sym, n) => {
@@ -404,12 +407,16 @@ crate fn lit_token(lit: token::Lit, suf: Option<Symbol>, diag: Option<(Span, &Ha
         token::ByteStr(i) => {
             let s = &i.as_str();
             let mut buf = Vec::with_capacity(s.len());
+            let mut has_error = false;
             unescape_byte_str(s, &mut |_, unescaped_byte| {
                 match unescaped_byte {
                     Ok(c) => buf.push(c),
-                    Err(_) => buf.push(0),
+                    Err(_) => has_error = true,
                 }
             });
+            if has_error {
+                return (true, Some(LitKind::Err(i)));
+            }
             buf.shrink_to_fit();
             (true, Some(LitKind::ByteStr(Lrc::new(buf))))
         }