diff --git a/src/librustc_trans/mir/operand.rs b/src/librustc_trans/mir/operand.rs index a12d0fec1cdd0..1b8a05b6f6c74 100644 --- a/src/librustc_trans/mir/operand.rs +++ b/src/librustc_trans/mir/operand.rs @@ -338,8 +338,20 @@ impl<'a, 'tcx> MirContext<'a, 'tcx> { let a = base::from_immediate(bcx, a); let b = base::from_immediate(bcx, b); - bcx.store(a, bcx.struct_gep(lldest, ix0), f_align); - bcx.store(b, bcx.struct_gep(lldest, ix1), f_align); + + // See comment above about zero-sized values. + let (a_zst, b_zst) = common::type_pair_fields(bcx.ccx, operand.ty) + .map_or((false, false), |[a_ty, b_ty]| { + (common::type_is_zero_size(bcx.ccx, a_ty), + common::type_is_zero_size(bcx.ccx, b_ty)) + }); + + if !a_zst { + bcx.store(a, bcx.struct_gep(lldest, ix0), f_align); + } + if !b_zst { + bcx.store(b, bcx.struct_gep(lldest, ix1), f_align); + } } } } diff --git a/src/test/codegen/mir_zst_stores.rs b/src/test/codegen/mir_zst_stores.rs index a2cedc853a1e6..36602196cefeb 100644 --- a/src/test/codegen/mir_zst_stores.rs +++ b/src/test/codegen/mir_zst_stores.rs @@ -13,13 +13,15 @@ #![crate_type = "lib"] use std::marker::PhantomData; - +#[derive(Copy, Clone)] struct Zst { phantom: PhantomData } // CHECK-LABEL: @mir +// CHECK-NOT: store{{.*}}undef #[no_mangle] -fn mir(){ - // CHECK-NOT: getelementptr - // CHECK-NOT: store{{.*}}undef +fn mir() { let x = Zst { phantom: PhantomData }; + let y = (x, 0); + drop(y); + drop((0, x)); }