rustc_trans: do not store pair fields if they are ZSTs.
This commit is contained in:
parent
c94a9ac8ae
commit
1a2eb4953e
@ -338,9 +338,21 @@ impl<'a, 'tcx> MirContext<'a, 'tcx> {
|
||||
|
||||
let a = base::from_immediate(bcx, a);
|
||||
let b = base::from_immediate(bcx, b);
|
||||
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -13,13 +13,15 @@
|
||||
#![crate_type = "lib"]
|
||||
use std::marker::PhantomData;
|
||||
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
struct Zst { phantom: PhantomData<Zst> }
|
||||
|
||||
// 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));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user