Skip to content

Commit 61a28d5

Browse files
committed
do the variant idx computations on the host (non-overflowing)
1 parent 75fe84f commit 61a28d5

File tree

2 files changed

+13
-17
lines changed

2 files changed

+13
-17
lines changed

src/librustc_mir/interpret/operand.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -687,24 +687,22 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
687687
(dataful_variant.as_u32() as u128, dataful_variant)
688688
},
689689
Ok(raw_discr) => {
690+
// We need to use machine arithmetic to get the relative variant idx.
690691
let discr_layout = self.layout_of(discr_layout.value.to_int_ty(*self.tcx))?;
691692
let discr_val = ImmTy::from_uint(raw_discr, discr_layout);
692-
// We need to use machine arithmetic.
693693
let niche_start_val = ImmTy::from_uint(niche_start, discr_layout);
694-
let variants_start_val = ImmTy::from_uint(variants_start, discr_layout);
695694
let variant_index_relative_val = self.binary_op(
696695
mir::BinOp::Sub,
697696
discr_val,
698697
niche_start_val,
699698
)?;
700-
let variant_index_val = self.binary_op(
701-
mir::BinOp::Add,
702-
variant_index_relative_val,
703-
variants_start_val,
704-
)?;
705-
let variant_index = variant_index_val
699+
let variant_index_relative = variant_index_relative_val
706700
.to_scalar()?
707701
.assert_bits(discr_val.layout.size);
702+
// Then computing the absolute variant idx should not overflow any more.
703+
let variant_index = variants_start
704+
.checked_add(variant_index_relative)
705+
.expect("oveflow computing absolute variant idx");
708706
// Check if this is in the range that indicates an actual discriminant.
709707
if variants_start <= variant_index && variant_index <= variants_end {
710708
let index = variant_index as usize;

src/librustc_mir/interpret/place.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,17 +1060,15 @@ where
10601060
variant_index.as_usize() < dest.layout.ty.ty_adt_def().unwrap().variants.len(),
10611061
);
10621062
if variant_index != dataful_variant {
1063-
let discr_layout = self.layout_of(discr_layout.value.to_int_ty(*self.tcx))?;
1064-
// We need to use machine arithmetic.
10651063
let variants_start = niche_variants.start().as_u32();
1066-
let variants_start_val = ImmTy::from_uint(variants_start, discr_layout);
1064+
let variant_index_relative = variant_index.as_u32()
1065+
.checked_sub(variants_start)
1066+
.expect("overflow computing relative variant idx");
1067+
// We need to use machine arithmetic when taking into account `niche_start`.
1068+
let discr_layout = self.layout_of(discr_layout.value.to_int_ty(*self.tcx))?;
10671069
let niche_start_val = ImmTy::from_uint(niche_start, discr_layout);
1068-
let variant_index_val = ImmTy::from_uint(variant_index.as_u32(), discr_layout);
1069-
let variant_index_relative_val = self.binary_op(
1070-
mir::BinOp::Sub,
1071-
variant_index_val,
1072-
variants_start_val,
1073-
)?;
1070+
let variant_index_relative_val =
1071+
ImmTy::from_uint(variant_index_relative, discr_layout);
10741072
let discr_val = self.binary_op(
10751073
mir::BinOp::Add,
10761074
variant_index_relative_val,

0 commit comments

Comments
 (0)