Skip to content

Commit 7a28ffc

Browse files
committed
Fix miri Discriminant() for non-ADT
1 parent 3c5f850 commit 7a28ffc

File tree

1 file changed

+19
-10
lines changed

1 file changed

+19
-10
lines changed

src/librustc_mir/interpret/eval_context.rs

+19-10
Original file line numberDiff line numberDiff line change
@@ -743,20 +743,29 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
743743

744744
Discriminant(ref place) => {
745745
let ty = self.place_ty(place);
746+
let layout = self.layout_of(ty)?;
746747
let place = self.eval_place(place)?;
747748
let discr_val = self.read_discriminant_value(place, ty)?;
748-
if let ty::TyAdt(adt_def, _) = ty.sty {
749-
trace!("Read discriminant {}, valid discriminants {:?}", discr_val, adt_def.discriminants(*self.tcx).collect::<Vec<_>>());
750-
if adt_def.discriminants(*self.tcx).all(|v| {
751-
discr_val != v.val
752-
})
753-
{
754-
return err!(InvalidDiscriminant);
749+
match layout.variants {
750+
layout::Variants::Single { index } => {
751+
assert_eq!(discr_val, index as u128);
752+
}
753+
layout::Variants::Tagged { .. } |
754+
layout::Variants::NicheFilling { .. } => {
755+
if let ty::TyAdt(adt_def, _) = ty.sty {
756+
trace!("Read discriminant {}, valid discriminants {:?}", discr_val, adt_def.discriminants(*self.tcx).collect::<Vec<_>>());
757+
if adt_def.discriminants(*self.tcx).all(|v| {
758+
discr_val != v.val
759+
})
760+
{
761+
return err!(InvalidDiscriminant);
762+
}
763+
} else {
764+
bug!("rustc only generates Rvalue::Discriminant for enums");
765+
}
755766
}
756-
self.write_primval(dest, PrimVal::Bytes(discr_val), dest_ty)?;
757-
} else {
758-
bug!("rustc only generates Rvalue::Discriminant for enums");
759767
}
768+
self.write_primval(dest, PrimVal::Bytes(discr_val), dest_ty)?;
760769
}
761770
}
762771

0 commit comments

Comments
 (0)