@@ -4632,35 +4632,37 @@ pub struct UnboxedClosureUpvar {
4632
4632
// Returns a list of `UnboxedClosureUpvar`s for each upvar.
4633
4633
pub fn unboxed_closure_upvars ( tcx : & ctxt , closure_id : ast:: DefId , substs : & Substs )
4634
4634
-> Vec < UnboxedClosureUpvar > {
4635
- if closure_id. krate == ast:: LOCAL_CRATE {
4636
- let capture_mode = tcx. capture_modes . borrow ( ) . get_copy ( & closure_id. node ) ;
4637
- match tcx. freevars . borrow ( ) . find ( & closure_id. node ) {
4638
- None => vec ! [ ] ,
4639
- Some ( ref freevars) => {
4640
- freevars. iter ( ) . map ( |freevar| {
4641
- let freevar_def_id = freevar. def . def_id ( ) ;
4642
- let freevar_ty = node_id_to_type ( tcx, freevar_def_id. node ) ;
4643
- let mut freevar_ty = freevar_ty. subst ( tcx, substs) ;
4644
- if capture_mode == ast:: CaptureByRef {
4645
- let borrow = tcx. upvar_borrow_map . borrow ( ) . get_copy ( & ty:: UpvarId {
4646
- var_id : freevar_def_id. node ,
4647
- closure_expr_id : closure_id. node
4648
- } ) ;
4649
- freevar_ty = mk_rptr ( tcx, borrow. region , ty:: mt {
4650
- ty : freevar_ty,
4651
- mutbl : borrow. kind . to_mutbl_lossy ( )
4652
- } ) ;
4653
- }
4654
- UnboxedClosureUpvar {
4655
- def : freevar. def ,
4656
- span : freevar. span ,
4657
- ty : freevar_ty
4658
- }
4659
- } ) . collect ( )
4660
- }
4635
+ // Presently an unboxed closure type cannot "escape" out of a
4636
+ // function, so we will only encounter ones that originated in the
4637
+ // local crate or were inlined into it along with some function.
4638
+ // This may change if abstract return types of some sort are
4639
+ // implemented.
4640
+ assert ! ( closure_id. krate == ast:: LOCAL_CRATE ) ;
4641
+ let capture_mode = tcx. capture_modes . borrow ( ) . get_copy ( & closure_id. node ) ;
4642
+ match tcx. freevars . borrow ( ) . find ( & closure_id. node ) {
4643
+ None => vec ! [ ] ,
4644
+ Some ( ref freevars) => {
4645
+ freevars. iter ( ) . map ( |freevar| {
4646
+ let freevar_def_id = freevar. def . def_id ( ) ;
4647
+ let freevar_ty = node_id_to_type ( tcx, freevar_def_id. node ) ;
4648
+ let mut freevar_ty = freevar_ty. subst ( tcx, substs) ;
4649
+ if capture_mode == ast:: CaptureByRef {
4650
+ let borrow = tcx. upvar_borrow_map . borrow ( ) . get_copy ( & ty:: UpvarId {
4651
+ var_id : freevar_def_id. node ,
4652
+ closure_expr_id : closure_id. node
4653
+ } ) ;
4654
+ freevar_ty = mk_rptr ( tcx, borrow. region , ty:: mt {
4655
+ ty : freevar_ty,
4656
+ mutbl : borrow. kind . to_mutbl_lossy ( )
4657
+ } ) ;
4658
+ }
4659
+ UnboxedClosureUpvar {
4660
+ def : freevar. def ,
4661
+ span : freevar. span ,
4662
+ ty : freevar_ty
4663
+ }
4664
+ } ) . collect ( )
4661
4665
}
4662
- } else {
4663
- tcx. sess . bug ( "unimplemented cross-crate closure upvars" )
4664
4666
}
4665
4667
}
4666
4668
0 commit comments