diff --git a/example/std_example.rs b/example/std_example.rs index 1bf0ff64c92..b762bba70eb 100644 --- a/example/std_example.rs +++ b/example/std_example.rs @@ -155,12 +155,25 @@ fn main() { } foo(I64X2(0, 0)); + + transmute_fat_pointer(); } fn panic(_: u128) { panic!(); } +use std::mem::transmute; + +#[cfg(target_pointer_width = "32")] +type TwoPtrs = i64; +#[cfg(target_pointer_width = "64")] +type TwoPtrs = i128; + +fn transmute_fat_pointer() -> TwoPtrs { + unsafe { transmute::<_, TwoPtrs>("true !") } +} + #[repr(simd)] struct I64X2(i64, i64); diff --git a/src/value_and_place.rs b/src/value_and_place.rs index 5be98c49234..ab7b053c895 100644 --- a/src/value_and_place.rs +++ b/src/value_and_place.rs @@ -587,7 +587,14 @@ impl<'tcx> CPlace<'tcx> { let dst_layout = self.layout(); match self.inner { CPlaceInner::Var(_local, var) => { - let data = CValue(from.0, dst_layout).load_scalar(fx); + let data = match from.1.abi { + Abi::Scalar(_) => CValue(from.0, dst_layout).load_scalar(fx), + _ => { + let (ptr, meta) = from.force_stack(fx); + assert!(meta.is_none()); + CValue(CValueInner::ByRef(ptr, None), dst_layout).load_scalar(fx) + } + }; let dst_ty = fx.clif_type(self.layout().ty).unwrap(); transmute_scalar(fx, var, data, dst_ty); }