From 35b1b62ddfc31c2e52b65c2f908c0fcbc6465de5 Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Mon, 17 Feb 2014 00:57:16 +1100 Subject: [PATCH] std: decode even numbered non-BMP planes in the UTF-16 decoder. Fixes #12318. --- src/libstd/str.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/libstd/str.rs b/src/libstd/str.rs index 1ef622002c31..34bcb083134c 100644 --- a/src/libstd/str.rs +++ b/src/libstd/str.rs @@ -881,7 +881,7 @@ impl<'a> Iterator for UTF16Items<'a> { } // all ok, so lets decode it. - let c = (u - 0xD800) as u32 << 10 | (u2 - 0xDC00) as u32 | 0x1_0000; + let c = ((u - 0xD800) as u32 << 10 | (u2 - 0xDC00) as u32) + 0x1_0000; Some(ScalarValue(unsafe {cast::transmute(c)})) } } @@ -3824,7 +3824,10 @@ mod tests { 0xdc9c_u16, 0xd801_u16, 0xdc92_u16, 0xd801_u16, 0xdc96_u16, 0xd801_u16, 0xdc86_u16, 0x0020_u16, 0xd801_u16, 0xdc95_u16, 0xd801_u16, 0xdc86_u16, - 0x000a_u16 ]) ]; + 0x000a_u16 ]), + // Issue #12318, even-numbered non-BMP planes + (~"\U00020000", + ~[0xD840, 0xDC00])]; for p in pairs.iter() { let (s, u) = (*p).clone();