File tree Expand file tree Collapse file tree 3 files changed +14
-1
lines changed Expand file tree Collapse file tree 3 files changed +14
-1
lines changed Original file line number Diff line number Diff line change @@ -101,7 +101,7 @@ pub enum InstanceDef<'tcx> {
101101        // because the signature of `<{async fn} as FnMut>::call_mut` is: 
102102        // `fn(&mut self, args: A) -> <Self as FnOnce>::Output`, that is to say 
103103        // that it returns the `FnOnce`-flavored coroutine but takes the closure 
104-         // by ref (and similarly for `Fn::call`). 
104+         // by mut  ref (and similarly for `Fn::call`). 
105105        receiver_by_ref :  bool , 
106106    } , 
107107
Original file line number Diff line number Diff line change @@ -2461,6 +2461,10 @@ impl<'tcx> Ty<'tcx> {
24612461/// `AsyncFn`/`AsyncFnMut`/`AsyncFnOnce`, we only need to distinguish two coroutine 
24622462/// bodies: by-ref and by-value. 
24632463/// 
2464+ /// See the definition of `AsyncFn` and `AsyncFnMut` and the `CallRefFuture` 
2465+ /// associated type for why we don't distinguish [`ClosureKind::Fn`] and 
2466+ /// [`ClosureKind::FnMut`] for the purpose of the generated MIR bodies. 
2467+ /// 
24642468/// This method should be used when constructing a `Coroutine` out of a 
24652469/// `CoroutineClosure`, when the `Coroutine`'s `kind` field is being populated 
24662470/// directly from the `CoroutineClosure`'s `kind`. 
Original file line number Diff line number Diff line change @@ -1023,7 +1023,16 @@ fn build_construct_coroutine_by_move_shim<'tcx>(
10231023        bug ! ( ) ; 
10241024    } ; 
10251025
1026+     // We use `*mut Self` here because we only need to emit an ABI-compatible shim body, 
1027+     // rather than match the signature exactly. 
1028+     // 
1029+     // The self type here is a coroutine-closure, not a coroutine, and we never read from 
1030+     // it because it never has any captures, because this is only true in the Fn/FnMut 
1031+     // implementation, not the AsyncFn/AsyncFnMut implementation, which is implemented only 
1032+     // if the coroutine-closure has no captures. 
10261033    if  receiver_by_ref { 
1034+         // Triple-check that there's no captures here. 
1035+         assert_eq ! ( args. as_coroutine_closure( ) . tupled_upvars_ty( ) ,  tcx. types. unit) ; 
10271036        self_ty = Ty :: new_mut_ptr ( tcx,  self_ty) ; 
10281037    } 
10291038
 
 
   
 
     
   
   
          
    
    
     
    
      
     
     
    You can’t perform that action at this time.
  
 
    
  
    
      
        
     
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments