diff options
| author | bors <bors@rust-lang.org> | 2018-03-28 08:01:22 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-03-28 08:01:22 +0000 |
| commit | bcffdf1b6da161eecd761eb4a3ef703ff05c33f6 (patch) | |
| tree | 73aeb763d2f28fa243ddba8777ef616941231714 | |
| parent | e58df0d8c5221fa5743587740eb50e4db42c3d1e (diff) | |
| parent | bda718fd255237167f08198b0fc80ab0d484d58e (diff) | |
| download | rust-bcffdf1b6da161eecd761eb4a3ef703ff05c33f6.tar.gz rust-bcffdf1b6da161eecd761eb4a3ef703ff05c33f6.zip | |
Auto merge of #49383 - nox:scalarpair, r=eddyb
Allow niche-filling dataful variants to be represented as a ScalarPair r? @eddyb
| -rw-r--r-- | src/librustc/ty/layout.rs | 19 | ||||
| -rw-r--r-- | src/test/codegen/function-arguments.rs | 6 |
2 files changed, 21 insertions, 4 deletions
diff --git a/src/librustc/ty/layout.rs b/src/librustc/ty/layout.rs index 029dd6f1fb4..5f9c305d92f 100644 --- a/src/librustc/ty/layout.rs +++ b/src/librustc/ty/layout.rs @@ -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 { diff --git a/src/test/codegen/function-arguments.rs b/src/test/codegen/function-arguments.rs index 0e98d3f9050..de302c69056 100644 --- a/src/test/codegen/function-arguments.rs +++ b/src/test/codegen/function-arguments.rs @@ -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] { |
