about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc_mir/interpret/eval_context.rs5
-rw-r--r--tests/run-pass/closure-field-ty.rs10
2 files changed, 15 insertions, 0 deletions
diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs
index d4b7761567d..cc1b5509ab0 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 00000000000..0d27728d223
--- /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);
+}