Skip to content

Commit e537078

Browse files
committed
Fix transmutes to/from type with unspecified layout (Utf8Char)
This crate (among others) did'nt compile with an experimental [more strict transmute check](rust-lang/rust#51294) Hare's the error messages: (from http://cargobomb-reports.s3.amazonaws.com/pr-51294/5298b81bebd26bb9f87d5f99764aab01595b3f69-alt/reg/encode_unicode-0.3.1/log.txt) Jul 05 13:02:02.884 INFO kablam! error[E0912]: transmutation to a type with an unspecified layout Jul 05 13:02:02.884 INFO kablam! --> src/utf8_char.rs:283:16 Jul 05 13:02:02.884 INFO kablam! | Jul 05 13:02:02.884 INFO kablam! 283 | Ok(transmute(unused_zeroed)) Jul 05 13:02:02.884 INFO kablam! | ^^^^^^^^^ Jul 05 13:02:02.884 INFO kablam! | Jul 05 13:02:02.884 INFO kablam! = note: utf8_char::Utf8Char has an unspecified layout Jul 05 13:02:02.884 INFO kablam! Jul 05 13:02:02.884 INFO kablam! error[E0912]: transmutation from a type with an unspecified layout Jul 05 13:02:02.884 INFO kablam! --> src/utf8_iterator.rs:25:41 Jul 05 13:02:02.884 INFO kablam! | Jul 05 13:02:02.884 INFO kablam! 25 | let used = u32::from_le(unsafe{ mem::transmute(uc) }); Jul 05 13:02:02.884 INFO kablam! | ^^^^^^^^^^^^^^ Jul 05 13:02:02.884 INFO kablam! | Jul 05 13:02:02.884 INFO kablam! = note: utf8_char::Utf8Char has an unspecified layout Jul 05 13:02:02.884 INFO kablam! Jul 05 13:02:02.893 INFO kablam! error: aborting due to 2 previous errors
1 parent dd089d3 commit e537078

File tree

2 files changed

+2
-2
lines changed

2 files changed

+2
-2
lines changed

src/utf8_char.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ impl Utf8Char {
282282
let extra = utf8[0].extra_utf8_bytes_unchecked() as u32;
283283
let mask = u32::from_le(0xff_ff_ff_ff >> 8*(3-extra));
284284
let unused_zeroed = mask & transmute::<_,u32>(utf8);
285-
Ok(transmute(unused_zeroed))
285+
Ok(Utf8Char{ bytes: transmute(unused_zeroed) })
286286
}
287287
}
288288
/// Unused bytes must be zero

src/utf8_iterator.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ pub struct Utf8Iterator (u32);
2222

2323
impl From<Utf8Char> for Utf8Iterator {
2424
fn from(uc: Utf8Char) -> Self {
25-
let used = u32::from_le(unsafe{ mem::transmute(uc) });
25+
let used = u32::from_le(unsafe{ mem::transmute(uc.to_array().0) });
2626
// uses u64 because shifting an u32 by 32 bits is a no-op.
2727
let unused_set = (u64::MAX << uc.len() as u64*8) as u32;
2828
Utf8Iterator(used | unused_set)

0 commit comments

Comments
 (0)