Allow niche-filling dataful variants to be represented as a ScalarPair
This commit is contained in:
parent
184156ed97
commit
bda718fd25
@ -1517,10 +1517,21 @@ impl<'a, 'tcx> LayoutCx<'tcx, TyCtxt<'a, 'tcx, 'tcx>> {
|
||||
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 {
|
||||
|
@ -133,6 +133,12 @@ pub fn trait_borrow(_: &Drop) {
|
||||
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] {
|
||||
|
Loading…
Reference in New Issue
Block a user