@@ -24,6 +24,8 @@ pub(crate) struct MirPatch<'tcx> {
2424 // Cached block for UnwindTerminate (with reason)
2525 terminate_block : Option < ( BasicBlock , UnwindTerminateReason ) > ,
2626 body_span : Span ,
27+ /// The number of locals at the start of the transformation. New locals
28+ /// get appended at the end.
2729 next_local : usize ,
2830 /// The number of blocks at the start of the transformation. New blocks
2931 /// get appended at the end.
@@ -176,8 +178,7 @@ impl<'tcx> MirPatch<'tcx> {
176178 span : Span ,
177179 local_info : LocalInfo < ' tcx > ,
178180 ) -> Local {
179- let index = self . next_local ;
180- self . next_local += 1 ;
181+ let index = self . next_local + self . new_locals . len ( ) ;
181182 let mut new_decl = LocalDecl :: new ( ty, span) ;
182183 * * new_decl. local_info . as_mut ( ) . unwrap_crate_local ( ) = local_info;
183184 self . new_locals . push ( new_decl) ;
@@ -186,17 +187,16 @@ impl<'tcx> MirPatch<'tcx> {
186187
187188 /// Queues the addition of a new temporary.
188189 pub ( crate ) fn new_temp ( & mut self , ty : Ty < ' tcx > , span : Span ) -> Local {
189- let index = self . next_local ;
190- self . next_local += 1 ;
190+ let index = self . next_local + self . new_locals . len ( ) ;
191191 self . new_locals . push ( LocalDecl :: new ( ty, span) ) ;
192192 Local :: new ( index)
193193 }
194194
195195 /// Returns the type of a local that's newly-added in the patch.
196196 pub ( crate ) fn local_ty ( & self , local : Local ) -> Ty < ' tcx > {
197197 let local = local. as_usize ( ) ;
198- assert ! ( local < self . next_local) ;
199- let new_local_idx = self . new_locals . len ( ) - ( self . next_local - local ) ;
198+ assert ! ( local < self . next_local + self . new_locals . len ( ) ) ;
199+ let new_local_idx = local - self . next_local ;
200200 self . new_locals [ new_local_idx] . ty
201201 }
202202
0 commit comments