@@ -333,28 +333,24 @@ impl<'tcx> Stacks {
333
333
for stack in stacks. iter_mut ( ptr. offset , size) {
334
334
// Access source `ptr`, create new ref.
335
335
let ptr_idx = stack. deref ( ptr. tag , new_kind) . map_err ( EvalErrorKind :: MachineError ) ?;
336
- if new_kind == RefKind :: Raw {
337
- assert ! ( new_bor. is_shared( ) ) ;
338
- // Raw references do not get quite as many guarantees as the other kinds:
339
- // If we can deref the new tag already, and if that tag lives higher on
340
- // the stack than the one we come from, just use that.
341
- // IOW, we check if `new_bor` *already* is "derived from" `ptr.tag`.
342
- match ( ptr_idx, stack. deref ( new_bor, new_kind) ) {
343
- // If the new borrow works with the forzen item, or else if it lives
344
- // above the old one in the stack, our job here is done.
345
- ( _, Ok ( None ) ) => {
346
- trace ! ( "reborrow-to-raw on a frozen location is a NOP" ) ;
347
- continue
348
- } ,
349
- ( Some ( ptr_idx) , Ok ( Some ( new_idx) ) ) if new_idx >= ptr_idx => {
350
- trace ! ( "reborrow-to-raw is a NOP because the src ptr already got reborrowed-to-raw" ) ;
351
- continue
352
- } ,
353
- _ => { } ,
354
- }
336
+ // If we can deref the new tag already, and if that tag lives higher on
337
+ // the stack than the one we come from, just use that.
338
+ // IOW, we check if `new_bor` *already* is "derived from" `ptr.tag`.
339
+ // This also checks frozenness, if required.
340
+ let bor_already_happened = match ( ptr_idx, stack. deref ( new_bor, new_kind) ) {
341
+ // If the new borrow works with the frozen item, or else if it lives
342
+ // above the old one in the stack, our job here is done.
343
+ ( _, Ok ( None ) ) => true ,
344
+ ( Some ( ptr_idx) , Ok ( Some ( new_idx) ) ) if new_idx >= ptr_idx => true ,
345
+ // Otherwise we need to create a new borrow.
346
+ _ => false ,
347
+ } ;
348
+ if bor_already_happened {
349
+ assert ! ( new_bor. is_shared( ) , "A unique reborrow can never be redundant" ) ;
350
+ trace ! ( "Reborrow is a NOP" ) ;
351
+ continue ;
355
352
}
356
- // Non-raw reborrows should behave exactly as if we also did a
357
- // read/write to the given location.
353
+ // We need to do some actual work.
358
354
stack. access ( ptr. tag , new_kind == RefKind :: Unique ) ?;
359
355
stack. create ( new_bor, new_kind) ;
360
356
}
0 commit comments