diff options
| author | bors <bors@rust-lang.org> | 2018-05-06 15:17:13 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-05-06 15:17:13 +0000 |
| commit | fb9e0588901dc2311f5e8f63f1c041e83041a596 (patch) | |
| tree | b9a3c4902618105f94df39d71087d2681ca9343d /src/libsyntax_ext/assert.rs | |
| parent | 2416032bb79ede22388b3be10a7a8b94dccd5109 (diff) | |
| parent | 39df2231bb7d3de171b6a7117bb76bbee5a4597f (diff) | |
| download | rust-fb9e0588901dc2311f5e8f63f1c041e83041a596.tar.gz rust-fb9e0588901dc2311f5e8f63f1c041e83041a596.zip | |
Auto merge of #50474 - sinkuu:fix_assert_ice, r=alexcrichton
Fix ICE in assertion macro
Fixes #50471. Needs beta-backport (stable-to-beta/nightly regression).
* `panic` with single argument does not need escaping `{` and `}`
* Instead of unescaping `\u{...}` manually, just use `escape_debug` in pprust
Diffstat (limited to 'src/libsyntax_ext/assert.rs')
| -rw-r--r-- | src/libsyntax_ext/assert.rs | 61 |
1 files changed, 4 insertions, 57 deletions
diff --git a/src/libsyntax_ext/assert.rs b/src/libsyntax_ext/assert.rs index 7352c494a42..754f04a26e7 100644 --- a/src/libsyntax_ext/assert.rs +++ b/src/libsyntax_ext/assert.rs @@ -42,16 +42,13 @@ pub fn expand_assert<'cx>( tts: if let Some(ts) = custom_msg_args { ts.into() } else { - // `expr_to_string` escapes the string literals with `.escape_default()` - // which escapes all non-ASCII characters with `\u`. - let escaped_expr = escape_format_string(&unescape_printable_unicode( - &pprust::expr_to_string(&cond_expr), - )); - TokenStream::from(TokenTree::Token( DUMMY_SP, token::Literal( - token::Lit::Str_(Name::intern(&format!("assertion failed: {}", escaped_expr))), + token::Lit::Str_(Name::intern(&format!( + "assertion failed: {}", + pprust::expr_to_string(&cond_expr).escape_debug() + ))), None, ), )).into() @@ -71,53 +68,3 @@ pub fn expand_assert<'cx>( ); MacEager::expr(if_expr) } - -/// Escapes a string for use as a formatting string. -fn escape_format_string(s: &str) -> String { - let mut res = String::with_capacity(s.len()); - for c in s.chars() { - res.extend(c.escape_debug()); - match c { - '{' | '}' => res.push(c), - _ => {} - } - } - res -} - -#[test] -fn test_escape_format_string() { - assert!(escape_format_string(r"foo{}\") == r"foo{{}}\\"); -} - -/// Unescapes the escaped unicodes (`\u{...}`) that are printable. -fn unescape_printable_unicode(mut s: &str) -> String { - use std::{char, u32}; - - let mut res = String::with_capacity(s.len()); - - loop { - if let Some(start) = s.find(r"\u{") { - res.push_str(&s[0..start]); - s = &s[start..]; - s.find('}') - .and_then(|end| { - let v = u32::from_str_radix(&s[3..end], 16).ok()?; - let c = char::from_u32(v)?; - // Escape unprintable characters. - res.extend(c.escape_debug()); - s = &s[end + 1..]; - Some(()) - }) - .expect("lexer should have rejected invalid escape sequences"); - } else { - res.push_str(s); - return res; - } - } -} - -#[test] -fn test_unescape_printable_unicode() { - assert!(unescape_printable_unicode(r"\u{2603}\n\u{0}") == r"☃\n\u{0}"); -} |
