about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorBrian Koropoff <bkoropoff@gmail.com>2014-10-02 19:41:42 -0700
committerBrian Koropoff <bkoropoff@gmail.com>2014-10-02 21:08:45 -0700
commit72dc0f5f82efcf891581fdc3ec15eb46f38cd718 (patch)
tree24ef849cdaf6de1e2409d7fa2ffc44ebab37944a /src
parent931f59f214f68bf2a5656d605cb200f22d47cdf8 (diff)
downloadrust-72dc0f5f82efcf891581fdc3ec15eb46f38cd718.tar.gz
rust-72dc0f5f82efcf891581fdc3ec15eb46f38cd718.zip
Return correct types for capture-by-ref unboxed closure upvars
Treat upvars of capture-by-reference unboxed closures as references
with appropriate regions and mutability.
Diffstat (limited to 'src')
-rw-r--r--src/librustc/middle/ty.rs14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs
index b38f362dcf1..e771c3d967a 100644
--- a/src/librustc/middle/ty.rs
+++ b/src/librustc/middle/ty.rs
@@ -4668,15 +4668,27 @@ pub struct UnboxedClosureUpvar {
 pub fn unboxed_closure_upvars(tcx: &ctxt, closure_id: ast::DefId)
                               -> Vec<UnboxedClosureUpvar> {
     if closure_id.krate == ast::LOCAL_CRATE {
+        let capture_mode = tcx.capture_modes.borrow().get_copy(&closure_id.node);
         match tcx.freevars.borrow().find(&closure_id.node) {
             None => vec![],
             Some(ref freevars) => {
                 freevars.iter().map(|freevar| {
                     let freevar_def_id = freevar.def.def_id();
+                    let mut freevar_ty = node_id_to_type(tcx, freevar_def_id.node);
+                    if capture_mode == ast::CaptureByRef {
+                        let borrow = tcx.upvar_borrow_map.borrow().get_copy(&ty::UpvarId {
+                            var_id: freevar_def_id.node,
+                            closure_expr_id: closure_id.node
+                        });
+                        freevar_ty = mk_rptr(tcx, borrow.region, ty::mt {
+                            ty: freevar_ty,
+                            mutbl: borrow.kind.to_mutbl_lossy()
+                        });
+                    }
                     UnboxedClosureUpvar {
                         def: freevar.def,
                         span: freevar.span,
-                        ty: node_id_to_type(tcx, freevar_def_id.node),
+                        ty: freevar_ty
                     }
                 }).collect()
             }