@@ -301,6 +301,7 @@ fn load_environment<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
301
301
fn load_unboxed_closure_environment < ' blk , ' tcx > (
302
302
bcx : Block < ' blk , ' tcx > ,
303
303
arg_scope_id : ScopeId ,
304
+ freevar_mode : ast:: CaptureClause ,
304
305
freevars : & Vec < ty:: Freevar > ,
305
306
closure_id : ast:: DefId )
306
307
-> Block < ' blk , ' tcx > {
@@ -326,11 +327,14 @@ fn load_unboxed_closure_environment<'blk, 'tcx>(
326
327
} ;
327
328
328
329
for ( i, freevar) in freevars. iter ( ) . enumerate ( ) {
329
- let upvar_ptr = GEPi ( bcx, llenv, [ 0 , i] ) ;
330
+ let mut upvar_ptr = GEPi ( bcx, llenv, [ 0 , i] ) ;
331
+ if freevar_mode == ast:: CaptureByRef {
332
+ upvar_ptr = Load ( bcx, upvar_ptr) ;
333
+ }
330
334
let def_id = freevar. def . def_id ( ) ;
331
335
bcx. fcx . llupvars . borrow_mut ( ) . insert ( def_id. node , upvar_ptr) ;
332
336
333
- if kind == ty:: FnOnceUnboxedClosureKind {
337
+ if kind == ty:: FnOnceUnboxedClosureKind && freevar_mode == ast :: CaptureByValue {
334
338
bcx. fcx . schedule_drop_mem ( arg_scope_id,
335
339
upvar_ptr,
336
340
node_id_type ( bcx, def_id. node ) )
@@ -477,6 +481,7 @@ pub fn trans_unboxed_closure<'blk, 'tcx>(
477
481
let freevars: Vec < ty:: Freevar > =
478
482
ty:: with_freevars ( bcx. tcx ( ) , id, |fv| fv. iter ( ) . map ( |& fv| fv) . collect ( ) ) ;
479
483
let freevars_ptr = & freevars;
484
+ let freevar_mode = bcx. tcx ( ) . capture_mode ( id) ;
480
485
481
486
trans_closure ( bcx. ccx ( ) ,
482
487
decl,
@@ -493,6 +498,7 @@ pub fn trans_unboxed_closure<'blk, 'tcx>(
493
498
|bcx, arg_scope| {
494
499
load_unboxed_closure_environment ( bcx,
495
500
arg_scope,
501
+ freevar_mode,
496
502
freevars_ptr,
497
503
closure_id)
498
504
} ) ;
@@ -518,7 +524,14 @@ pub fn trans_unboxed_closure<'blk, 'tcx>(
518
524
dest_addr,
519
525
0 ,
520
526
i) ;
521
- bcx = datum. store_to ( bcx, upvar_slot_dest) ;
527
+ match freevar_mode {
528
+ ast:: CaptureByValue => {
529
+ bcx = datum. store_to ( bcx, upvar_slot_dest) ;
530
+ }
531
+ ast:: CaptureByRef => {
532
+ Store ( bcx, datum. to_llref ( ) , upvar_slot_dest) ;
533
+ }
534
+ }
522
535
}
523
536
adt:: trans_set_discr ( bcx, & * repr, dest_addr, 0 ) ;
524
537
0 commit comments