@@ -1495,20 +1495,27 @@ impl<'tcx> euv::Delegate<'tcx> for ReassignmentChecker {
1495
1495
fn decl_without_init ( & mut self , _: ast:: NodeId , _: Span ) { }
1496
1496
1497
1497
fn mutate ( & mut self , _: ast:: NodeId , _: Span , cmt : mc:: cmt , _: euv:: MutateMode ) {
1498
+ let cmt_id = |cmt : & mc:: cmt | match cmt. cat {
1499
+ Categorization :: Upvar ( mc:: Upvar { id : ty:: UpvarId { var_id : vid, ..} , ..} ) |
1500
+ Categorization :: Local ( vid) => Some ( vid) ,
1501
+ Categorization :: Interior ( ref base_cmt, mc:: InteriorField ( _) ) => Some ( base_cmt. id ) ,
1502
+ _ => None
1503
+ } ;
1498
1504
match cmt. cat {
1499
1505
Categorization :: Upvar ( mc:: Upvar { id : ty:: UpvarId { var_id : vid, .. } , .. } ) |
1500
1506
Categorization :: Local ( vid) => self . reassigned |= self . node == vid,
1501
- Categorization :: Interior ( ref base_cmt, mc:: InteriorField ( field) ) => {
1502
- match base_cmt. cat {
1503
- Categorization :: Upvar ( mc:: Upvar { id : ty:: UpvarId { var_id : vid, .. } , .. } ) |
1504
- Categorization :: Local ( vid) => {
1505
- self . reassigned |= self . node == vid &&
1506
- ( self . field . is_none ( ) || Some ( field) == self . field )
1507
- } ,
1508
- _ => { }
1507
+ ref cat => {
1508
+ let mut cat = cat;
1509
+ while let & Categorization :: Interior ( ref base_cmt, mc:: InteriorField ( field) ) = cat {
1510
+ if let Some ( vid) = cmt_id ( base_cmt) {
1511
+ if self . node == vid && ( self . field . is_none ( ) || self . field == Some ( field) ) {
1512
+ self . reassigned = true ;
1513
+ return ;
1514
+ }
1515
+ }
1516
+ cat = & base_cmt. cat ;
1509
1517
}
1510
- } ,
1511
- _ => { }
1518
+ }
1512
1519
}
1513
1520
}
1514
1521
}
0 commit comments