@@ -167,12 +167,12 @@ struct ValidityVisitor<'rt, 'a: 'rt, 'mir: 'rt, 'tcx: 'a+'rt+'mir, M: Machine<'a
167167} 
168168
169169impl < ' rt ,  ' a ,  ' mir ,  ' tcx ,  M :  Machine < ' a ,  ' mir ,  ' tcx > >  ValidityVisitor < ' rt ,  ' a ,  ' mir ,  ' tcx ,  M >  { 
170-     fn  push_aggregate_field_path_elem ( 
170+     fn  aggregate_field_path_elem ( 
171171        & mut  self , 
172172        layout :  TyLayout < ' tcx > , 
173173        field :  usize , 
174-     )  { 
175-         let  elem =  match  layout. ty . sty  { 
174+     )  ->  PathElem   { 
175+         match  layout. ty . sty  { 
176176            // generators and closures. 
177177            ty:: Closure ( def_id,  _)  | ty:: Generator ( def_id,  _,  _)  => { 
178178                if  let  Some ( upvar)  = self . ecx . tcx . optimized_mir ( def_id) . upvar_decls . get ( field)  { 
@@ -194,11 +194,7 @@ impl<'rt, 'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> ValidityVisitor<'rt, 'a, '
194194                    layout:: Variants :: Single  {  index }  =>
195195                        // Inside a variant 
196196                        PathElem :: Field ( def. variants [ index] . fields [ field] . ident . name ) , 
197-                     _ => { 
198-                         // Enums have no fields other than their tag 
199-                         assert_eq ! ( field,  0 ) ; 
200-                         PathElem :: Tag 
201-                     } 
197+                     _ => bug ! ( ) , 
202198                } 
203199            } 
204200
@@ -213,8 +209,22 @@ impl<'rt, 'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> ValidityVisitor<'rt, 'a, '
213209
214210            // nothing else has an aggregate layout 
215211            _ => bug ! ( "aggregate_field_path_elem: got non-aggregate type {:?}" ,  layout. ty) , 
216-         } ; 
212+         } 
213+     } 
214+ 
215+     fn  visit_elem ( 
216+         & mut  self , 
217+         new_op :  OpTy < ' tcx ,  M :: PointerTag > , 
218+         elem :  PathElem , 
219+     )  -> EvalResult < ' tcx >  { 
220+         // Remember the old state 
221+         let  path_len = self . path . len ( ) ; 
222+         // Perform operation 
217223        self . path . push ( elem) ; 
224+         self . visit_value ( new_op) ?; 
225+         // Undo changes 
226+         self . path . truncate ( path_len) ; 
227+         Ok ( ( ) ) 
218228    } 
219229} 
220230
@@ -235,14 +245,8 @@ impl<'rt, 'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>>
235245        field :  usize , 
236246        new_op :  OpTy < ' tcx ,  M :: PointerTag > 
237247    )  -> EvalResult < ' tcx >  { 
238-         // Remember the old state 
239-         let  path_len = self . path . len ( ) ; 
240-         // Perform operation 
241-         self . push_aggregate_field_path_elem ( old_op. layout ,  field) ; 
242-         self . visit_value ( new_op) ?; 
243-         // Undo changes 
244-         self . path . truncate ( path_len) ; 
245-         Ok ( ( ) ) 
248+         let  elem = self . aggregate_field_path_elem ( old_op. layout ,  field) ; 
249+         self . visit_elem ( new_op,  elem) 
246250    } 
247251
248252    #[ inline]  
@@ -252,15 +256,8 @@ impl<'rt, 'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>>
252256        variant_id :  VariantIdx , 
253257        new_op :  OpTy < ' tcx ,  M :: PointerTag > 
254258    )  -> EvalResult < ' tcx >  { 
255-         // Remember the old state 
256-         let  path_len = self . path . len ( ) ; 
257-         // Perform operation 
258259        let  name = old_op. layout . ty . ty_adt_def ( ) . unwrap ( ) . variants [ variant_id] . name ; 
259-         self . path . push ( PathElem :: Variant ( name) ) ; 
260-         self . visit_value ( new_op) ?; 
261-         // Undo changes 
262-         self . path . truncate ( path_len) ; 
263-         Ok ( ( ) ) 
260+         self . visit_elem ( new_op,  PathElem :: Variant ( name) ) 
264261    } 
265262
266263    #[ inline]  
0 commit comments