From c8be312933c375a76a021a947330f1024dc83b9a Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 6 Jun 2017 09:49:34 -0400 Subject: [PATCH] fix issue 184 by marking the destination as a packed struct --- src/terminator/intrinsic.rs | 11 ++++++++++- tests/run-pass/issue-miri-184.rs | 4 ++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 tests/run-pass/issue-miri-184.rs diff --git a/src/terminator/intrinsic.rs b/src/terminator/intrinsic.rs index 31886e9cc6d9..193b7c3cde17 100644 --- a/src/terminator/intrinsic.rs +++ b/src/terminator/intrinsic.rs @@ -383,8 +383,17 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { } "transmute" => { + let src_ty = substs.type_at(0); let dest_ty = substs.type_at(1); - self.write_value(arg_vals[0], dest, dest_ty)?; + let (_, src_align) = self.size_and_align_of_dst(src_ty, arg_vals[0])?; + let (size, dest_align) = self.size_and_align_of_dst(dest_ty, arg_vals[0])?; + if dest_align < src_align { + let ptr = self.force_allocation(dest)?.to_ptr(); + self.memory.mark_packed(ptr, size); + self.write_value_to_ptr(arg_vals[0], ptr, dest_ty)?; + } else { + self.write_value(arg_vals[0], dest, dest_ty)?; + } } "uninit" => { diff --git a/tests/run-pass/issue-miri-184.rs b/tests/run-pass/issue-miri-184.rs new file mode 100644 index 000000000000..24775fe8a2d9 --- /dev/null +++ b/tests/run-pass/issue-miri-184.rs @@ -0,0 +1,4 @@ +pub fn main() { + let bytes: [u8; 8] = unsafe { ::std::mem::transmute(0u64) }; + let _: &[u8] = &bytes; +}