From a071e1c61653792ebdc41e8804da4f1695b13ffa Mon Sep 17 00:00:00 2001
From: David Renshaw <dwrenshaw@gmail.com>
Date: Sat, 6 Jan 2018 15:44:33 -0500
Subject: [PATCH] fix argument unpacking issue and add a test that exercises
 the problem

---
 src/terminator/mod.rs      | 4 ++++
 tests/run-pass/iter_any.rs | 9 +++++++++
 2 files changed, 13 insertions(+)
 create mode 100644 tests/run-pass/iter_any.rs

diff --git a/src/terminator/mod.rs b/src/terminator/mod.rs
index a65cd02..10faf30 100644
--- a/src/terminator/mod.rs
+++ b/src/terminator/mod.rs
@@ -440,12 +440,16 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
                                     Value::ByVal(PrimVal::Undef) => {}
                                     other => {
                                         let mut layout = layout;
+                                        let mut skip_arg_locals = true;
                                         '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;
+                                                    skip_arg_locals = false;
                                                     continue 'outer;
+                                                } else if skip_arg_locals {
+                                                    arg_locals.next().unwrap();
                                                 }
                                             }
                                             break;
diff --git a/tests/run-pass/iter_any.rs b/tests/run-pass/iter_any.rs
new file mode 100644
index 0000000..955d39d
--- /dev/null
+++ b/tests/run-pass/iter_any.rs
@@ -0,0 +1,9 @@
+pub fn main() {
+    let g = |(), x: &u8| { 10u8 == *x };
+    g((), &1u8);
+
+    let f = |x: &u8| { 10u8 == *x };
+    f(&1u8);
+
+    [1, 2, 3u8].into_iter().any(|elt| 10 == *elt);
+}
-- 
GitLab