diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/base.rs | 3 | ||||
| -rw-r--r-- | src/discriminant.rs | 12 |
2 files changed, 12 insertions, 3 deletions
diff --git a/src/base.rs b/src/base.rs index 8c45993a8b7..65346cb3962 100644 --- a/src/base.rs +++ b/src/base.rs @@ -821,7 +821,8 @@ pub(crate) fn codegen_place<'tcx>( if cplace.layout().ty.is_box() { cplace = cplace .place_field(fx, Field::new(0)) // Box<T> -> Unique<T> - .place_field(fx, Field::new(0)) // Unique<T> -> *const T + .place_field(fx, Field::new(0)) // Unique<T> -> NonNull<T> + .place_field(fx, Field::new(0)) // NonNull<T> -> *mut T .place_deref(fx); } else { cplace = cplace.place_deref(fx); diff --git a/src/discriminant.rs b/src/discriminant.rs index 357cb4a6d24..f619bb5ed5e 100644 --- a/src/discriminant.rs +++ b/src/discriminant.rs @@ -128,8 +128,16 @@ pub(crate) fn codegen_get_discriminant<'tcx>( let relative_discr = if niche_start == 0 { tag } else { - // FIXME handle niche_start > i64::MAX - fx.bcx.ins().iadd_imm(tag, -i64::try_from(niche_start).unwrap()) + let niche_start = match fx.bcx.func.dfg.value_type(tag) { + types::I128 => { + let lsb = fx.bcx.ins().iconst(types::I64, niche_start as u64 as i64); + let msb = + fx.bcx.ins().iconst(types::I64, (niche_start >> 64) as u64 as i64); + fx.bcx.ins().iconcat(lsb, msb) + } + ty => fx.bcx.ins().iconst(ty, niche_start as i64), + }; + fx.bcx.ins().isub(tag, niche_start) }; let relative_max = niche_variants.end().as_u32() - niche_variants.start().as_u32(); let is_niche = { |
