@@ -431,38 +431,45 @@ impl<'a, 'tcx> GatherLoanCtxt<'a, 'tcx> {
431
431
// }
432
432
// }
433
433
}
434
-
434
+
435
435
pub fn mark_loan_path_as_mutated ( & self , loan_path : & LoanPath ) {
436
436
//! For mutable loans of content whose mutability derives
437
437
//! from a local variable, mark the mutability decl as necessary.
438
438
439
- match loan_path. kind {
440
- LpVar ( local_id) |
441
- LpUpvar ( ty:: UpvarId { var_id : local_id, closure_expr_id : _ } ) => {
442
- self . tcx ( ) . used_mut_nodes . borrow_mut ( ) . insert ( local_id) ;
443
- }
444
- LpExtend ( ref base, mc:: McInherited , LpDeref ( pointer_kind) ) |
445
- LpExtend ( ref base, mc:: McDeclared , LpDeref ( pointer_kind) ) => {
446
- match base. kind {
447
- LpVar ( _) if pointer_kind != mc:: Unique => {
448
- // If you mutate the inside of a ref var, the var itself
449
- // is not used mutably [Issue #25049]
450
- // Unless it's a Box! (mc::Unique)
439
+ let mut wrapped_path = Some ( loan_path) ;
440
+ let mut through_borrow = false ;
441
+
442
+ while let Some ( current_path) = wrapped_path {
443
+ wrapped_path = match current_path. kind {
444
+ LpVar ( local_id) => {
445
+ if !through_borrow {
446
+ self . tcx ( ) . used_mut_nodes . borrow_mut ( ) . insert ( local_id) ;
451
447
}
452
- _ => {
453
- self . mark_loan_path_as_mutated ( & base) ;
448
+ None
449
+ }
450
+ LpUpvar ( ty:: UpvarId { var_id : local_id, closure_expr_id : _ } ) => {
451
+ self . tcx ( ) . used_mut_nodes . borrow_mut ( ) . insert ( local_id) ;
452
+ None
453
+ }
454
+ LpExtend ( ref base, mc:: McInherited , LpDeref ( pointer_kind) ) |
455
+ LpExtend ( ref base, mc:: McDeclared , LpDeref ( pointer_kind) ) => {
456
+ if pointer_kind != mc:: Unique {
457
+ through_borrow = true ;
454
458
}
459
+ Some ( base)
455
460
}
456
- }
457
- LpDowncast ( ref base, _) |
458
- LpExtend ( ref base, mc:: McInherited , _) |
459
- LpExtend ( ref base, mc:: McDeclared , _) => {
460
- self . mark_loan_path_as_mutated ( & base) ;
461
- }
462
- LpExtend ( _, mc:: McImmutable , _) => {
463
- // Nothing to do.
464
- }
461
+ LpDowncast ( ref base, _) |
462
+ LpExtend ( ref base, mc:: McInherited , _) |
463
+ LpExtend ( ref base, mc:: McDeclared , _) => {
464
+ Some ( base)
465
+ }
466
+ LpExtend ( _, mc:: McImmutable , _) => {
467
+ // Nothing to do.
468
+ None
469
+ }
470
+ }
465
471
}
472
+
466
473
}
467
474
468
475
pub fn compute_gen_scope ( & self ,
0 commit comments