]> git.lizzy.rs Git - rust.git/commitdiff
Fix manual rust-call impls
authorOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>
Thu, 23 Mar 2017 14:07:33 +0000 (15:07 +0100)
committerOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>
Thu, 23 Mar 2017 14:07:33 +0000 (15:07 +0100)
src/terminator/mod.rs

index fa74e57132035708233141cae727a03a29a57615..de3742caf131bbabc97377bb3e5a4bddd9b7035a 100644 (file)
@@ -227,13 +227,19 @@ fn eval_fn_call(
                         let (arg_val, arg_ty) = args.remove(0);
                         let layout = self.type_layout(arg_ty)?;
                         if let (&ty::TyTuple(fields, _), &Layout::Univariant { ref variant, .. }) = (&arg_ty.sty, layout) {
-                            let offsets = variant.offsets.iter().map(|s| s.bytes());
-                            if let Value::ByRef(ptr) = arg_val {
-                                for ((offset, ty), arg_local) in offsets.zip(fields).zip(arg_locals) {
-                                    let arg = Value::ByRef(ptr.offset(offset));
-                                    let dest = self.eval_lvalue(&mir::Lvalue::Local(arg_local))?;
-                                    self.write_value(arg, dest, ty)?;
+                            if self.frame().mir.args_iter().count() == fields.len() + 1 {
+                                let offsets = variant.offsets.iter().map(|s| s.bytes());
+                                if let Value::ByRef(ptr) = arg_val {
+                                    for ((offset, ty), arg_local) in offsets.zip(fields).zip(arg_locals) {
+                                        let arg = Value::ByRef(ptr.offset(offset));
+                                        let dest = self.eval_lvalue(&mir::Lvalue::Local(arg_local))?;
+                                        self.write_value(arg, dest, ty)?;
+                                    }
                                 }
+                            } else {
+                                // called a manual impl of a rust-call function
+                                let dest = self.eval_lvalue(&mir::Lvalue::Local(arg_locals.next().unwrap()))?;
+                                self.write_value(arg_val, dest, arg_ty)?;
                             }
                         } else {
                             bug!("rust-call ABI tuple argument was {:?}, {:?}", arg_ty, layout);