diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index b516fab4afad..9fbc32c4f005 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -1176,6 +1176,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 000000000000..0d27728d2232 --- /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); +}