From e332ab9b13998ced5b390a56326611c794cc60b9 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 19 Aug 2017 16:38:36 +0200 Subject: [PATCH] Handle closures in get_field_ty Fixes #304 --- src/librustc_mir/interpret/eval_context.rs | 5 +++++ tests/run-pass/closure-field-ty.rs | 10 ++++++++++ 2 files changed, 15 insertions(+) create mode 100644 tests/run-pass/closure-field-ty.rs diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index d4b7761567..cc1b5509ab 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -1144,6 +1144,11 @@ impl<'a, 'tcx, M: Machine<'tcx>> EvalContext<'a, 'tcx, M> { packed: false, }), + ty::TyClosure(def_id, ref closure_substs) => Ok(TyAndPacked { + ty: closure_substs.upvar_tys(def_id, self.tcx).nth(field_index).unwrap(), + packed: false, + }), + _ => { err!(Unimplemented( format!("can't handle type: {:?}, {:?}", ty, ty.sty), diff --git a/tests/run-pass/closure-field-ty.rs b/tests/run-pass/closure-field-ty.rs new file mode 100644 index 0000000000..0d27728d22 --- /dev/null +++ b/tests/run-pass/closure-field-ty.rs @@ -0,0 +1,10 @@ +// miri issue #304 +fn main() { + let mut y = 0; + { + let mut box_maybe_closure = Box::new(None); + *box_maybe_closure = Some(|| { y += 1; }); + (box_maybe_closure.unwrap())(); + } + assert_eq!(y, 1); +}