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