let offset = st[i].fields.offset(field_index) + offset;
let size = st[i].size;
- let abi = if offset.bytes() == 0 && niche.value.size(dl) == size {
- Abi::Scalar(niche.clone())
- } else {
- Abi::Aggregate { sized: true }
+ let abi = match st[i].abi {
+ Abi::Scalar(_) => Abi::Scalar(niche.clone()),
+ Abi::ScalarPair(ref first, ref second) => {
+ // We need to use scalar_unit to reset the
+ // valid range to the maximal one for that
+ // primitive, because only the niche is
+ // guaranteed to be initialised, not the
+ // other primitive.
+ if offset.bytes() == 0 {
+ Abi::ScalarPair(niche.clone(), scalar_unit(second.value))
+ } else {
+ Abi::ScalarPair(scalar_unit(first.value), niche.clone())
+ }
+ }
+ _ => Abi::Aggregate { sized: true },
};
return Ok(tcx.intern_layout(LayoutDetails {
pub fn trait_box(_: Box<Drop>) {
}
+// CHECK: { i8*, i8* } @trait_option(i8* noalias %x.0, i8* %x.1)
+#[no_mangle]
+pub fn trait_option(x: Option<Box<Drop>>) -> Option<Box<Drop>> {
+ x
+}
+
// CHECK: { [0 x i16]*, [[USIZE]] } @return_slice([0 x i16]* noalias nonnull readonly %x.0, [[USIZE]] %x.1)
#[no_mangle]
pub fn return_slice(x: &[u16]) -> &[u16] {