@@ -1495,20 +1495,27 @@ impl<'tcx> euv::Delegate<'tcx> for ReassignmentChecker {
14951495 fn decl_without_init ( & mut self , _: ast:: NodeId , _: Span ) { }
14961496
14971497 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+ } ;
14981504 match cmt. cat {
14991505 Categorization :: Upvar ( mc:: Upvar { id : ty:: UpvarId { var_id : vid, .. } , .. } ) |
15001506 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 ;
15091517 }
1510- } ,
1511- _ => { }
1518+ }
15121519 }
15131520 }
15141521}
0 commit comments