@@ -408,7 +408,7 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
408
408
rcvr_field : Place < ' tcx > ,
409
409
next : BasicBlock ,
410
410
cleanup : BasicBlock ,
411
- place : Place < ' tcx >
411
+ dest : Place < ' tcx >
412
412
) {
413
413
let tcx = self . tcx ;
414
414
@@ -452,7 +452,7 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
452
452
self . block ( vec ! [ statement] , TerminatorKind :: Call {
453
453
func,
454
454
args : vec ! [ Operand :: Move ( ref_loc) ] ,
455
- destination : Some ( ( place , next) ) ,
455
+ destination : Some ( ( dest , next) ) ,
456
456
cleanup : Some ( cleanup) ,
457
457
} , false ) ;
458
458
}
@@ -633,12 +633,13 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
633
633
634
634
let rcvr = Place :: Local ( Local :: new ( 1 +0 ) ) . deref ( ) ;
635
635
636
- let mut returns = Vec :: new ( ) ;
636
+ let mut previous_place = None ;
637
+ let return_place = Place :: Local ( RETURN_PLACE ) ;
637
638
for ( i, ity) in tys. iter ( ) . enumerate ( ) {
638
- let rcvr_field = rcvr. clone ( ) . field ( Field :: new ( i) , * ity) ;
639
+ let field = Field :: new ( i) ;
640
+ let rcvr_field = rcvr. clone ( ) . field ( field, * ity) ;
639
641
640
- let place = self . make_place ( Mutability :: Not , ity) ;
641
- returns. push ( place. clone ( ) ) ;
642
+ let place = return_place. clone ( ) . field ( field, * ity) ;
642
643
643
644
// BB #(2i)
644
645
// `returns[i] = Clone::clone(&rcvr.i);`
@@ -648,34 +649,26 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
648
649
rcvr_field,
649
650
BasicBlock :: new ( 2 * i + 2 ) ,
650
651
BasicBlock :: new ( 2 * i + 1 ) ,
651
- place
652
+ place. clone ( )
652
653
) ;
653
654
654
655
// BB #(2i + 1) (cleanup)
655
- if i == 0 {
656
- // Nothing to drop, just resume.
657
- self . block ( vec ! [ ] , TerminatorKind :: Resume , true ) ;
658
- } else {
656
+ if let Some ( previous_place) = previous_place. take ( ) {
659
657
// Drop previous field and goto previous cleanup block.
660
658
self . block ( vec ! [ ] , TerminatorKind :: Drop {
661
- location : returns [ i - 1 ] . clone ( ) ,
659
+ location : previous_place ,
662
660
target : BasicBlock :: new ( 2 * i - 1 ) ,
663
661
unwind : None ,
664
662
} , true ) ;
663
+ } else {
664
+ // Nothing to drop, just resume.
665
+ self . block ( vec ! [ ] , TerminatorKind :: Resume , true ) ;
665
666
}
667
+
668
+ previous_place = Some ( place) ;
666
669
}
667
670
668
- // `return kind(returns[0], returns[1], ..., returns[tys.len() - 1]);`
669
- let ret_statement = self . make_statement (
670
- StatementKind :: Assign (
671
- Place :: Local ( RETURN_PLACE ) ,
672
- Rvalue :: Aggregate (
673
- box kind,
674
- returns. into_iter ( ) . map ( Operand :: Move ) . collect ( )
675
- )
676
- )
677
- ) ;
678
- self . block ( vec ! [ ret_statement] , TerminatorKind :: Return , false ) ;
671
+ self . block ( vec ! [ ] , TerminatorKind :: Return , false ) ;
679
672
}
680
673
}
681
674
0 commit comments