about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Schneider <oli-obk@users.noreply.github.com>2017-08-24 15:30:35 +0200
committerGitHub <noreply@github.com>2017-08-24 15:30:35 +0200
commit110d50e7f95173c0bede64e588f832988d30c7a2 (patch)
tree4f095d2ab9d888a6b616c9be187f57b892ba29b0
parent9ede346ee26001ad4e3365f734e7dcd991095edf (diff)
parentf860ad8d2eaa2cc022d4d4a8427a2a908f39a6b3 (diff)
downloadrust-110d50e7f95173c0bede64e588f832988d30c7a2.tar.gz
rust-110d50e7f95173c0bede64e588f832988d30c7a2.zip
Merge branch 'master' into libstd
-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 b516fab4afa..9fbc32c4f00 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 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);
+}