diff --git a/src/terminator/mod.rs b/src/terminator/mod.rs index b99366ac0134d6b83cffb03f69369a6b5cce1f3d..a2966731491d13ae1a3047d6309e08d0c3df2872 100644 --- a/src/terminator/mod.rs +++ b/src/terminator/mod.rs @@ -438,12 +438,25 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { } Value::ByVal(PrimVal::Undef) => {} other => { - assert_eq!(layout.fields.count(), 1); + let mut layout = layout; + 'outer: loop { + for i in 0..layout.fields.count() { + let field = layout.field(&self, i)?; + if layout.fields.offset(i).bytes() == 0 && layout.size == field.size { + layout = field; + continue 'outer; + } + } + break; + } let dest = self.eval_lvalue(&mir::Place::Local( arg_locals.next().unwrap(), ))?; - let field_ty = layout.field(&self, 0)?.ty; - self.write_value(ValTy { value: other, ty: field_ty }, dest)?; + let valty = ValTy { + value: other, + ty: layout.ty, + }; + self.write_value(valty, dest)?; } } } else {