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