From 2b026cc756b9ebd79007d0863a69f034fb3555de Mon Sep 17 00:00:00 2001 From: David Renshaw <dwrenshaw@gmail.com> Date: Sun, 3 Dec 2017 11:35:53 -0500 Subject: [PATCH] pull in some update Abi::RustCall code from miri --- src/terminator/mod.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/terminator/mod.rs b/src/terminator/mod.rs index b99366a..a296673 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 { -- GitLab