@@ -505,11 +505,11 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
505505 fn array_shim ( & mut self , ty : Ty < ' tcx > , len : u64 ) {
506506 let tcx = self . tcx ;
507507 let span = self . span ;
508- let rcvr = Place :: Local ( Local :: new ( 1 +0 ) ) . deref ( ) ;
508+ let src = Place :: Local ( Local :: new ( 1 +0 ) ) . deref ( ) ;
509+ let dest = Place :: Local ( RETURN_PLACE ) ;
509510
510511 let beg = self . local_decls . push ( temp_decl ( Mutability :: Mut , tcx. types . usize , span) ) ;
511512 let end = self . make_place ( Mutability :: Not , tcx. types . usize ) ;
512- let ret = self . make_place ( Mutability :: Mut , tcx. mk_array ( ty, len) ) ;
513513
514514 // BB #0
515515 // `let mut beg = 0;`
@@ -539,25 +539,17 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
539539 self . loop_header ( Place :: Local ( beg) , end, BasicBlock :: new ( 2 ) , BasicBlock :: new ( 4 ) , false ) ;
540540
541541 // BB #2
542- // `let cloned = Clone::clone(rcvr [beg])`;
542+ // `dest[i] = Clone::clone(src [beg])`;
543543 // Goto #3 if ok, #5 if unwinding happens.
544- let rcvr_field = rcvr . clone ( ) . index ( beg) ;
545- let cloned = self . make_place ( Mutability :: Not , ty ) ;
546- self . make_clone_call ( cloned . clone ( ) , rcvr_field , ty, BasicBlock :: new ( 3 ) ,
544+ let dest_field = dest . clone ( ) . index ( beg) ;
545+ let src_field = src . clone ( ) . index ( beg ) ;
546+ self . make_clone_call ( dest_field , src_field , ty, BasicBlock :: new ( 3 ) ,
547547 BasicBlock :: new ( 5 ) ) ;
548548
549549 // BB #3
550- // `ret[beg] = cloned;`
551550 // `beg = beg + 1;`
552551 // `goto #1`;
553- let ret_field = ret. clone ( ) . index ( beg) ;
554552 let statements = vec ! [
555- self . make_statement(
556- StatementKind :: Assign (
557- ret_field,
558- Rvalue :: Use ( Operand :: Move ( cloned) )
559- )
560- ) ,
561553 self . make_statement(
562554 StatementKind :: Assign (
563555 Place :: Local ( beg) ,
@@ -572,14 +564,8 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
572564 self . block ( statements, TerminatorKind :: Goto { target : BasicBlock :: new ( 1 ) } , false ) ;
573565
574566 // BB #4
575- // `return ret;`
576- let ret_statement = self . make_statement (
577- StatementKind :: Assign (
578- Place :: Local ( RETURN_PLACE ) ,
579- Rvalue :: Use ( Operand :: Move ( ret. clone ( ) ) ) ,
580- )
581- ) ;
582- self . block ( vec ! [ ret_statement] , TerminatorKind :: Return , false ) ;
567+ // `return dest;`
568+ self . block ( vec ! [ ] , TerminatorKind :: Return , false ) ;
583569
584570 // BB #5 (cleanup)
585571 // `let end = beg;`
@@ -604,9 +590,9 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
604590 BasicBlock :: new ( 7 ) , BasicBlock :: new ( 9 ) , true ) ;
605591
606592 // BB #7 (cleanup)
607- // `drop(ret [beg])`;
593+ // `drop(dest [beg])`;
608594 self . block ( vec ! [ ] , TerminatorKind :: Drop {
609- location : ret . index ( beg) ,
595+ location : dest . index ( beg) ,
610596 target : BasicBlock :: new ( 8 ) ,
611597 unwind : None ,
612598 } , true ) ;
0 commit comments