@@ -74,7 +74,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
74
74
75
75
struct SeedBorrowKind < ' a , ' gcx : ' a +' tcx , ' tcx : ' a > {
76
76
fcx : & ' a FnCtxt < ' a , ' gcx , ' tcx > ,
77
- temp_closure_kinds : NodeMap < ( ty:: ClosureKind , Option < Span > ) > ,
77
+ temp_closure_kinds : NodeMap < ( ty:: ClosureKind , Option < ( Span , ast :: Name ) > ) > ,
78
78
}
79
79
80
80
impl < ' a , ' gcx , ' tcx > Visitor < ' gcx > for SeedBorrowKind < ' a , ' gcx , ' tcx > {
@@ -143,12 +143,12 @@ impl<'a, 'gcx, 'tcx> SeedBorrowKind<'a, 'gcx, 'tcx> {
143
143
144
144
struct AdjustBorrowKind < ' a , ' gcx : ' a +' tcx , ' tcx : ' a > {
145
145
fcx : & ' a FnCtxt < ' a , ' gcx , ' tcx > ,
146
- temp_closure_kinds : NodeMap < ( ty:: ClosureKind , Option < Span > ) > ,
146
+ temp_closure_kinds : NodeMap < ( ty:: ClosureKind , Option < ( Span , ast :: Name ) > ) > ,
147
147
}
148
148
149
149
impl < ' a , ' gcx , ' tcx > AdjustBorrowKind < ' a , ' gcx , ' tcx > {
150
150
fn new ( fcx : & ' a FnCtxt < ' a , ' gcx , ' tcx > ,
151
- temp_closure_kinds : NodeMap < ( ty:: ClosureKind , Option < Span > ) > )
151
+ temp_closure_kinds : NodeMap < ( ty:: ClosureKind , Option < ( Span , ast :: Name ) > ) > )
152
152
-> AdjustBorrowKind < ' a , ' gcx , ' tcx > {
153
153
AdjustBorrowKind { fcx : fcx, temp_closure_kinds : temp_closure_kinds }
154
154
}
@@ -211,8 +211,8 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
211
211
212
212
// If we are also inferred the closure kind here, update the
213
213
// main table and process any deferred resolutions.
214
- if let Some ( & ( kind, span ) ) = self . temp_closure_kinds . get ( & id) {
215
- self . fcx . tables . borrow_mut ( ) . closure_kinds . insert ( id, ( kind, span ) ) ;
214
+ if let Some ( & ( kind, context ) ) = self . temp_closure_kinds . get ( & id) {
215
+ self . fcx . tables . borrow_mut ( ) . closure_kinds . insert ( id, ( kind, context ) ) ;
216
216
let closure_def_id = self . fcx . tcx . hir . local_def_id ( id) ;
217
217
debug ! ( "closure_kind({:?}) = {:?}" , closure_def_id, kind) ;
218
218
@@ -272,11 +272,12 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
272
272
euv:: Move ( _) => { }
273
273
}
274
274
275
+ let tcx = self . fcx . tcx ;
276
+
275
277
// watch out for a move of the deref of a borrowed pointer;
276
278
// for that to be legal, the upvar would have to be borrowed
277
279
// by value instead
278
280
let guarantor = cmt. guarantor ( ) ;
279
- let tcx = self . fcx . tcx ;
280
281
debug ! ( "adjust_upvar_borrow_kind_for_consume: guarantor={:?}" ,
281
282
guarantor) ;
282
283
match guarantor. cat {
@@ -291,7 +292,8 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
291
292
// to move out of an upvar, this must be a FnOnce closure
292
293
self . adjust_closure_kind ( upvar_id. closure_expr_id ,
293
294
ty:: ClosureKind :: FnOnce ,
294
- tcx. hir . span ( upvar_id. var_id ) ) ;
295
+ guarantor. span ,
296
+ tcx. hir . name ( upvar_id. var_id ) ) ;
295
297
296
298
let upvar_capture_map =
297
299
& mut self . fcx . tables . borrow_mut ( ) . upvar_capture_map ;
@@ -306,7 +308,8 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
306
308
// of the environment.
307
309
self . adjust_closure_kind ( upvar_id. closure_expr_id ,
308
310
ty:: ClosureKind :: FnOnce ,
309
- tcx. hir . span ( upvar_id. var_id ) ) ;
311
+ guarantor. span ,
312
+ tcx. hir . name ( upvar_id. var_id ) ) ;
310
313
}
311
314
mc:: NoteNone => {
312
315
}
@@ -334,7 +337,7 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
334
337
335
338
Categorization :: Deref ( base, _, mc:: BorrowedPtr ( ..) ) |
336
339
Categorization :: Deref ( base, _, mc:: Implicit ( ..) ) => {
337
- if !self . try_adjust_upvar_deref ( & cmt. note , ty:: MutBorrow ) {
340
+ if !self . try_adjust_upvar_deref ( cmt, ty:: MutBorrow ) {
338
341
// assignment to deref of an `&mut`
339
342
// borrowed pointer implies that the
340
343
// pointer itself must be unique, but not
@@ -368,7 +371,7 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
368
371
369
372
Categorization :: Deref ( base, _, mc:: BorrowedPtr ( ..) ) |
370
373
Categorization :: Deref ( base, _, mc:: Implicit ( ..) ) => {
371
- if !self . try_adjust_upvar_deref ( & cmt. note , ty:: UniqueImmBorrow ) {
374
+ if !self . try_adjust_upvar_deref ( cmt, ty:: UniqueImmBorrow ) {
372
375
// for a borrowed pointer to be unique, its
373
376
// base must be unique
374
377
self . adjust_upvar_borrow_kind_for_unique ( base) ;
@@ -385,7 +388,7 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
385
388
}
386
389
387
390
fn try_adjust_upvar_deref ( & mut self ,
388
- note : & mc:: Note ,
391
+ cmt : mc:: cmt < ' tcx > ,
389
392
borrow_kind : ty:: BorrowKind )
390
393
-> bool
391
394
{
@@ -399,7 +402,7 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
399
402
400
403
let tcx = self . fcx . tcx ;
401
404
402
- match * note {
405
+ match cmt . note {
403
406
mc:: NoteUpvarRef ( upvar_id) => {
404
407
// if this is an implicit deref of an
405
408
// upvar, then we need to modify the
@@ -414,7 +417,8 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
414
417
// also need to be in an FnMut closure since this is not an ImmBorrow
415
418
self . adjust_closure_kind ( upvar_id. closure_expr_id ,
416
419
ty:: ClosureKind :: FnMut ,
417
- tcx. hir . span ( upvar_id. var_id ) ) ;
420
+ cmt. span ,
421
+ tcx. hir . name ( upvar_id. var_id ) ) ;
418
422
419
423
true
420
424
}
@@ -424,7 +428,8 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
424
428
// upvar, we need to be an FnMut closure
425
429
self . adjust_closure_kind ( upvar_id. closure_expr_id ,
426
430
ty:: ClosureKind :: FnMut ,
427
- tcx. hir . span ( upvar_id. var_id ) ) ;
431
+ cmt. span ,
432
+ tcx. hir . name ( upvar_id. var_id ) ) ;
428
433
429
434
true
430
435
}
@@ -472,9 +477,10 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
472
477
fn adjust_closure_kind ( & mut self ,
473
478
closure_id : ast:: NodeId ,
474
479
new_kind : ty:: ClosureKind ,
475
- upvar_span : Span ) {
476
- debug ! ( "adjust_closure_kind(closure_id={}, new_kind={:?})" ,
477
- closure_id, new_kind) ;
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) ;
478
484
479
485
if let Some ( & ( existing_kind, _) ) = self . temp_closure_kinds . get ( & closure_id) {
480
486
debug ! ( "adjust_closure_kind: closure_id={}, existing_kind={:?}, new_kind={:?}" ,
@@ -492,7 +498,10 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
492
498
( ty:: ClosureKind :: Fn , ty:: ClosureKind :: FnOnce ) |
493
499
( ty:: ClosureKind :: FnMut , ty:: ClosureKind :: FnOnce ) => {
494
500
// new kind is stronger than the old kind
495
- self . temp_closure_kinds . insert ( closure_id, ( new_kind, Some ( upvar_span) ) ) ;
501
+ self . temp_closure_kinds . insert (
502
+ closure_id,
503
+ ( new_kind, Some ( ( upvar_span, var_name) ) )
504
+ ) ;
496
505
}
497
506
}
498
507
}
0 commit comments