Skip to content

Commit d278ce1

Browse files
committed
Return ImmTy in discriminant_for_variant.
1 parent 1d6a32c commit d278ce1

File tree

4 files changed

+11
-13
lines changed

4 files changed

+11
-13
lines changed

compiler/rustc_const_eval/src/interpret/discriminant.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -247,9 +247,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
247247
&self,
248248
layout: TyAndLayout<'tcx>,
249249
variant: VariantIdx,
250-
) -> InterpResult<'tcx, Scalar<M::Provenance>> {
250+
) -> InterpResult<'tcx, ImmTy<'tcx, M::Provenance>> {
251251
let discr_layout = self.layout_of(layout.ty.discriminant_ty(*self.tcx))?;
252-
Ok(match layout.ty.discriminant_for_variant(*self.tcx, variant) {
252+
let discr_value = match layout.ty.discriminant_for_variant(*self.tcx, variant) {
253253
Some(discr) => {
254254
// This type actually has discriminants.
255255
assert_eq!(discr.ty, discr_layout.ty);
@@ -260,6 +260,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
260260
assert_eq!(variant.as_u32(), 0);
261261
Scalar::from_uint(variant.as_u32(), discr_layout.size)
262262
}
263-
})
263+
};
264+
Ok(ImmTy::from_scalar(discr_value, discr_layout))
264265
}
265266
}

compiler/rustc_const_eval/src/interpret/intrinsics.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
221221
sym::discriminant_value => {
222222
let place = self.deref_pointer(&args[0])?;
223223
let variant = self.read_discriminant(&place)?;
224-
let discr = self.discriminant_for_variant(place.layout, variant)?;
224+
let discr = self.discriminant_for_variant(place.layout, variant)?.to_scalar();
225225
self.write_scalar(discr, dest)?;
226226
}
227227
sym::exact_div => {

compiler/rustc_const_eval/src/interpret/step.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
301301
let op = self.eval_place_to_op(place, None)?;
302302
let variant = self.read_discriminant(&op)?;
303303
let discr = self.discriminant_for_variant(op.layout, variant)?;
304-
self.write_scalar(discr, &dest)?;
304+
self.write_immediate(*discr, &dest)?;
305305
}
306306
}
307307

compiler/rustc_mir_transform/src/dataflow_const_prop.rs

+5-8
Original file line numberDiff line numberDiff line change
@@ -405,10 +405,8 @@ impl<'a, 'tcx> ConstAnalysis<'a, 'tcx> {
405405
TrackElem::Variant(idx) => self.ecx.project_downcast(op, idx).ok(),
406406
TrackElem::Discriminant => {
407407
let variant = self.ecx.read_discriminant(op).ok()?;
408-
let scalar = self.ecx.discriminant_for_variant(op.layout, variant).ok()?;
409-
let discr_ty = op.layout.ty.discriminant_ty(self.tcx);
410-
let layout = self.tcx.layout_of(self.param_env.and(discr_ty)).ok()?;
411-
Some(ImmTy::from_scalar(scalar, layout).into())
408+
let discr_value = self.ecx.discriminant_for_variant(op.layout, variant).ok()?;
409+
Some(discr_value.into())
412410
}
413411
TrackElem::DerefLen => {
414412
let op: OpTy<'_> = self.ecx.deref_pointer(op).ok()?.into();
@@ -505,10 +503,9 @@ impl<'a, 'tcx> ConstAnalysis<'a, 'tcx> {
505503
if !enum_ty.is_enum() {
506504
return None;
507505
}
508-
let discr = enum_ty.discriminant_for_variant(self.tcx, variant_index)?;
509-
let discr_layout = self.tcx.layout_of(self.param_env.and(discr.ty)).ok()?;
510-
let discr_value = Scalar::try_from_uint(discr.val, discr_layout.size)?;
511-
Some(discr_value)
506+
let enum_ty_layout = self.tcx.layout_of(self.param_env.and(enum_ty)).ok()?;
507+
let discr_value = self.ecx.discriminant_for_variant(enum_ty_layout, variant_index).ok()?;
508+
Some(discr_value.to_scalar())
512509
}
513510

514511
fn wrap_immediate(&self, imm: Immediate) -> FlatSet<Scalar> {

0 commit comments

Comments
 (0)