From 72dc0f5f82efcf891581fdc3ec15eb46f38cd718 Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Thu, 2 Oct 2014 19:41:42 -0700 Subject: [PATCH] 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. --- src/librustc/middle/ty.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index b38f362dcf18..e771c3d967a7 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 { 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() }