@@ -74,7 +74,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
7474
7575struct SeedBorrowKind < ' a , ' gcx : ' a +' tcx , ' tcx : ' a > {
7676 fcx : & ' a FnCtxt < ' a , ' gcx , ' tcx > ,
77- temp_closure_kinds : NodeMap < ty:: ClosureKind > ,
77+ temp_closure_kinds : NodeMap < ( ty:: ClosureKind , Option < ( Span , ast :: Name ) > ) > ,
7878}
7979
8080impl < ' a , ' gcx , ' tcx > Visitor < ' gcx > for SeedBorrowKind < ' a , ' gcx , ' tcx > {
@@ -107,7 +107,7 @@ impl<'a, 'gcx, 'tcx> SeedBorrowKind<'a, 'gcx, 'tcx> {
107107 capture_clause : hir:: CaptureClause )
108108 {
109109 if !self . fcx . tables . borrow ( ) . closure_kinds . contains_key ( & expr. id ) {
110- self . temp_closure_kinds . insert ( expr. id , ty:: ClosureKind :: Fn ) ;
110+ self . temp_closure_kinds . insert ( expr. id , ( ty:: ClosureKind :: Fn , None ) ) ;
111111 debug ! ( "check_closure: adding closure {:?} as Fn" , expr. id) ;
112112 }
113113
@@ -143,12 +143,12 @@ impl<'a, 'gcx, 'tcx> SeedBorrowKind<'a, 'gcx, 'tcx> {
143143
144144struct AdjustBorrowKind < ' a , ' gcx : ' a +' tcx , ' tcx : ' a > {
145145 fcx : & ' a FnCtxt < ' a , ' gcx , ' tcx > ,
146- temp_closure_kinds : NodeMap < ty:: ClosureKind > ,
146+ temp_closure_kinds : NodeMap < ( ty:: ClosureKind , Option < ( Span , ast :: Name ) > ) > ,
147147}
148148
149149impl < ' a , ' gcx , ' tcx > AdjustBorrowKind < ' a , ' gcx , ' tcx > {
150150 fn new ( fcx : & ' a FnCtxt < ' a , ' gcx , ' tcx > ,
151- temp_closure_kinds : NodeMap < ty:: ClosureKind > )
151+ temp_closure_kinds : NodeMap < ( ty:: ClosureKind , Option < ( Span , ast :: Name ) > ) > )
152152 -> AdjustBorrowKind < ' a , ' gcx , ' tcx > {
153153 AdjustBorrowKind { fcx : fcx, temp_closure_kinds : temp_closure_kinds }
154154 }
@@ -211,8 +211,8 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
211211
212212 // If we are also inferred the closure kind here, update the
213213 // main table and process any deferred resolutions.
214- if let Some ( & kind) = self . temp_closure_kinds . get ( & id) {
215- self . fcx . tables . borrow_mut ( ) . closure_kinds . insert ( id, kind) ;
214+ if let Some ( & ( kind, context ) ) = self . temp_closure_kinds . get ( & id) {
215+ self . fcx . tables . borrow_mut ( ) . closure_kinds . insert ( id, ( kind, context ) ) ;
216216 let closure_def_id = self . fcx . tcx . hir . local_def_id ( id) ;
217217 debug ! ( "closure_kind({:?}) = {:?}" , closure_def_id, kind) ;
218218
@@ -272,6 +272,8 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
272272 euv:: Move ( _) => { }
273273 }
274274
275+ let tcx = self . fcx . tcx ;
276+
275277 // watch out for a move of the deref of a borrowed pointer;
276278 // for that to be legal, the upvar would have to be borrowed
277279 // by value instead
@@ -289,7 +291,9 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
289291
290292 // to move out of an upvar, this must be a FnOnce closure
291293 self . adjust_closure_kind ( upvar_id. closure_expr_id ,
292- ty:: ClosureKind :: FnOnce ) ;
294+ ty:: ClosureKind :: FnOnce ,
295+ guarantor. span ,
296+ tcx. hir . name ( upvar_id. var_id ) ) ;
293297
294298 let upvar_capture_map =
295299 & mut self . fcx . tables . borrow_mut ( ) . upvar_capture_map ;
@@ -303,7 +307,9 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
303307 // to be a FnOnce closure to permit moves out
304308 // of the environment.
305309 self . adjust_closure_kind ( upvar_id. closure_expr_id ,
306- ty:: ClosureKind :: FnOnce ) ;
310+ ty:: ClosureKind :: FnOnce ,
311+ guarantor. span ,
312+ tcx. hir . name ( upvar_id. var_id ) ) ;
307313 }
308314 mc:: NoteNone => {
309315 }
@@ -331,7 +337,7 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
331337
332338 Categorization :: Deref ( base, _, mc:: BorrowedPtr ( ..) ) |
333339 Categorization :: Deref ( base, _, mc:: Implicit ( ..) ) => {
334- if !self . try_adjust_upvar_deref ( & cmt. note , ty:: MutBorrow ) {
340+ if !self . try_adjust_upvar_deref ( cmt, ty:: MutBorrow ) {
335341 // assignment to deref of an `&mut`
336342 // borrowed pointer implies that the
337343 // pointer itself must be unique, but not
@@ -365,7 +371,7 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
365371
366372 Categorization :: Deref ( base, _, mc:: BorrowedPtr ( ..) ) |
367373 Categorization :: Deref ( base, _, mc:: Implicit ( ..) ) => {
368- if !self . try_adjust_upvar_deref ( & cmt. note , ty:: UniqueImmBorrow ) {
374+ if !self . try_adjust_upvar_deref ( cmt, ty:: UniqueImmBorrow ) {
369375 // for a borrowed pointer to be unique, its
370376 // base must be unique
371377 self . adjust_upvar_borrow_kind_for_unique ( base) ;
@@ -382,7 +388,7 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
382388 }
383389
384390 fn try_adjust_upvar_deref ( & mut self ,
385- note : & mc:: Note ,
391+ cmt : mc:: cmt < ' tcx > ,
386392 borrow_kind : ty:: BorrowKind )
387393 -> bool
388394 {
@@ -394,7 +400,9 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
394400 ty:: ImmBorrow => false ,
395401 } ) ;
396402
397- match * note {
403+ let tcx = self . fcx . tcx ;
404+
405+ match cmt. note {
398406 mc:: NoteUpvarRef ( upvar_id) => {
399407 // if this is an implicit deref of an
400408 // upvar, then we need to modify the
@@ -407,15 +415,21 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
407415 }
408416
409417 // also need to be in an FnMut closure since this is not an ImmBorrow
410- self . adjust_closure_kind ( upvar_id. closure_expr_id , ty:: ClosureKind :: FnMut ) ;
418+ self . adjust_closure_kind ( upvar_id. closure_expr_id ,
419+ ty:: ClosureKind :: FnMut ,
420+ cmt. span ,
421+ tcx. hir . name ( upvar_id. var_id ) ) ;
411422
412423 true
413424 }
414425 mc:: NoteClosureEnv ( upvar_id) => {
415426 // this kind of deref occurs in a `move` closure, or
416427 // for a by-value upvar; in either case, to mutate an
417428 // upvar, we need to be an FnMut closure
418- self . adjust_closure_kind ( upvar_id. closure_expr_id , ty:: ClosureKind :: FnMut ) ;
429+ self . adjust_closure_kind ( upvar_id. closure_expr_id ,
430+ ty:: ClosureKind :: FnMut ,
431+ cmt. span ,
432+ tcx. hir . name ( upvar_id. var_id ) ) ;
419433
420434 true
421435 }
@@ -462,11 +476,13 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
462476
463477 fn adjust_closure_kind ( & mut self ,
464478 closure_id : ast:: NodeId ,
465- new_kind : ty:: ClosureKind ) {
466- debug ! ( "adjust_closure_kind(closure_id={}, new_kind={:?})" ,
467- closure_id, new_kind) ;
479+ new_kind : ty:: ClosureKind ,
480+ upvar_span : Span ,
481+ var_name : ast:: Name ) {
482+ debug ! ( "adjust_closure_kind(closure_id={}, new_kind={:?}, upvar_span={:?}, var_name={})" ,
483+ closure_id, new_kind, upvar_span, var_name) ;
468484
469- if let Some ( & existing_kind) = self . temp_closure_kinds . get ( & closure_id) {
485+ if let Some ( & ( existing_kind, _ ) ) = self . temp_closure_kinds . get ( & closure_id) {
470486 debug ! ( "adjust_closure_kind: closure_id={}, existing_kind={:?}, new_kind={:?}" ,
471487 closure_id, existing_kind, new_kind) ;
472488
@@ -482,7 +498,10 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
482498 ( ty:: ClosureKind :: Fn , ty:: ClosureKind :: FnOnce ) |
483499 ( ty:: ClosureKind :: FnMut , ty:: ClosureKind :: FnOnce ) => {
484500 // new kind is stronger than the old kind
485- self . temp_closure_kinds . insert ( closure_id, new_kind) ;
501+ self . temp_closure_kinds . insert (
502+ closure_id,
503+ ( new_kind, Some ( ( upvar_span, var_name) ) )
504+ ) ;
486505 }
487506 }
488507 }
0 commit comments