diff options
| author | Aleksey Kladov <aleksey.kladov@gmail.com> | 2019-05-02 20:56:07 +0300 |
|---|---|---|
| committer | Aleksey Kladov <aleksey.kladov@gmail.com> | 2019-05-02 21:01:02 +0300 |
| commit | 1835cbeb6574997ec5188cb22b9538c61976d2b4 (patch) | |
| tree | be4b47724ddef3bfd294597d1072a40dabb8ef3c /src/libsyntax/parse | |
| parent | bfa5f278472d0bad4e7db4a4259b2f1fa97ca0ab (diff) | |
| download | rust-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.rs | 21 |
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)))) } |
