Rollup merge of #49540 - bjorn3:fix_miri_discriminant, r=oli-obk
Fix miri Discriminant() for non-ADT Fixes #49327
This commit is contained in:
commit
b5ceda86aa
@ -743,8 +743,15 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
|
|||||||
|
|
||||||
Discriminant(ref place) => {
|
Discriminant(ref place) => {
|
||||||
let ty = self.place_ty(place);
|
let ty = self.place_ty(place);
|
||||||
|
let layout = self.layout_of(ty)?;
|
||||||
let place = self.eval_place(place)?;
|
let place = self.eval_place(place)?;
|
||||||
let discr_val = self.read_discriminant_value(place, ty)?;
|
let discr_val = self.read_discriminant_value(place, ty)?;
|
||||||
|
match layout.variants {
|
||||||
|
layout::Variants::Single { index } => {
|
||||||
|
assert_eq!(discr_val, index as u128);
|
||||||
|
}
|
||||||
|
layout::Variants::Tagged { .. } |
|
||||||
|
layout::Variants::NicheFilling { .. } => {
|
||||||
if let ty::TyAdt(adt_def, _) = ty.sty {
|
if let ty::TyAdt(adt_def, _) = ty.sty {
|
||||||
trace!("Read discriminant {}, valid discriminants {:?}", discr_val, adt_def.discriminants(*self.tcx).collect::<Vec<_>>());
|
trace!("Read discriminant {}, valid discriminants {:?}", discr_val, adt_def.discriminants(*self.tcx).collect::<Vec<_>>());
|
||||||
if adt_def.discriminants(*self.tcx).all(|v| {
|
if adt_def.discriminants(*self.tcx).all(|v| {
|
||||||
@ -753,12 +760,14 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
|
|||||||
{
|
{
|
||||||
return err!(InvalidDiscriminant);
|
return err!(InvalidDiscriminant);
|
||||||
}
|
}
|
||||||
self.write_primval(dest, PrimVal::Bytes(discr_val), dest_ty)?;
|
|
||||||
} else {
|
} else {
|
||||||
bug!("rustc only generates Rvalue::Discriminant for enums");
|
bug!("rustc only generates Rvalue::Discriminant for enums");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
self.write_primval(dest, PrimVal::Bytes(discr_val), dest_ty)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if log_enabled!(::log::Level::Trace) {
|
if log_enabled!(::log::Level::Trace) {
|
||||||
self.dump_local(dest);
|
self.dump_local(dest);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user