@@ -479,9 +479,10 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
479
479
480
480
fn array_shim ( & mut self , ty : ty:: Ty < ' tcx > , len : usize ) {
481
481
let tcx = self . tcx ;
482
+ let span = self . span ;
482
483
let rcvr = Lvalue :: Local ( Local :: new ( 1 +0 ) ) . deref ( ) ;
483
484
484
- let beg = self . make_lvalue ( Mutability :: Mut , tcx. types . usize ) ;
485
+ let beg = self . local_decls . push ( temp_decl ( Mutability :: Mut , tcx. types . usize , span ) ) ;
485
486
let end = self . make_lvalue ( Mutability :: Not , tcx. types . usize ) ;
486
487
let ret = self . make_lvalue ( Mutability :: Mut , tcx. mk_array ( ty, len) ) ;
487
488
@@ -492,7 +493,7 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
492
493
let inits = vec ! [
493
494
self . make_statement(
494
495
StatementKind :: Assign (
495
- beg . clone ( ) ,
496
+ Lvalue :: Local ( beg ) ,
496
497
Rvalue :: Use ( Operand :: Constant ( self . make_usize( 0 ) ) )
497
498
)
498
499
) ,
@@ -510,19 +511,19 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
510
511
// BB #3;
511
512
// }
512
513
// BB #4;
513
- self . loop_header ( beg . clone ( ) , end, BasicBlock :: new ( 2 ) , BasicBlock :: new ( 4 ) , false ) ;
514
+ self . loop_header ( Lvalue :: Local ( beg ) , end, BasicBlock :: new ( 2 ) , BasicBlock :: new ( 4 ) , false ) ;
514
515
515
516
// BB #2
516
517
// `let cloned = Clone::clone(rcvr[beg])`;
517
518
// Goto #3 if ok, #5 if unwinding happens.
518
- let rcvr_field = rcvr. clone ( ) . index ( Operand :: Consume ( beg. clone ( ) ) ) ;
519
+ let rcvr_field = rcvr. clone ( ) . index ( beg) ;
519
520
let cloned = self . make_clone_call ( ty, rcvr_field, BasicBlock :: new ( 3 ) , BasicBlock :: new ( 5 ) ) ;
520
521
521
522
// BB #3
522
523
// `ret[beg] = cloned;`
523
524
// `beg = beg + 1;`
524
525
// `goto #1`;
525
- let ret_field = ret. clone ( ) . index ( Operand :: Consume ( beg. clone ( ) ) ) ;
526
+ let ret_field = ret. clone ( ) . index ( beg) ;
526
527
let statements = vec ! [
527
528
self . make_statement(
528
529
StatementKind :: Assign (
@@ -532,10 +533,10 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
532
533
) ,
533
534
self . make_statement(
534
535
StatementKind :: Assign (
535
- beg . clone ( ) ,
536
+ Lvalue :: Local ( beg ) ,
536
537
Rvalue :: BinaryOp (
537
538
BinOp :: Add ,
538
- Operand :: Consume ( beg . clone ( ) ) ,
539
+ Operand :: Consume ( Lvalue :: Local ( beg ) ) ,
539
540
Operand :: Constant ( self . make_usize( 1 ) )
540
541
)
541
542
)
@@ -558,10 +559,10 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
558
559
// `let mut beg = 0;`
559
560
// goto #6;
560
561
let end = beg;
561
- let beg = self . make_lvalue ( Mutability :: Mut , tcx. types . usize ) ;
562
+ let beg = self . local_decls . push ( temp_decl ( Mutability :: Mut , tcx. types . usize , span ) ) ;
562
563
let init = self . make_statement (
563
564
StatementKind :: Assign (
564
- beg . clone ( ) ,
565
+ Lvalue :: Local ( beg ) ,
565
566
Rvalue :: Use ( Operand :: Constant ( self . make_usize ( 0 ) ) )
566
567
)
567
568
) ;
@@ -572,12 +573,13 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
572
573
// BB #8;
573
574
// }
574
575
// BB #9;
575
- self . loop_header ( beg. clone ( ) , end, BasicBlock :: new ( 7 ) , BasicBlock :: new ( 9 ) , true ) ;
576
+ self . loop_header ( Lvalue :: Local ( beg) , Lvalue :: Local ( end) ,
577
+ BasicBlock :: new ( 7 ) , BasicBlock :: new ( 9 ) , true ) ;
576
578
577
579
// BB #7 (cleanup)
578
580
// `drop(ret[beg])`;
579
581
self . block ( vec ! [ ] , TerminatorKind :: Drop {
580
- location : ret. index ( Operand :: Consume ( beg. clone ( ) ) ) ,
582
+ location : ret. index ( beg) ,
581
583
target : BasicBlock :: new ( 8 ) ,
582
584
unwind : None ,
583
585
} , true ) ;
@@ -587,10 +589,10 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
587
589
// `goto #6;`
588
590
let statement = self . make_statement (
589
591
StatementKind :: Assign (
590
- beg . clone ( ) ,
592
+ Lvalue :: Local ( beg ) ,
591
593
Rvalue :: BinaryOp (
592
594
BinOp :: Add ,
593
- Operand :: Consume ( beg . clone ( ) ) ,
595
+ Operand :: Consume ( Lvalue :: Local ( beg ) ) ,
594
596
Operand :: Constant ( self . make_usize ( 1 ) )
595
597
)
596
598
)
0 commit comments