@@ -2020,13 +2020,15 @@ fn type_is_structural_or_param(tcx: ty::ctxt, t: ty::t) -> bool {
2020
2020
2021
2021
fn copy_val ( cx : @block_ctxt , action : copy_action , dst : ValueRef ,
2022
2022
src : ValueRef , t : ty:: t ) -> @block_ctxt {
2023
- if type_is_structural_or_param ( bcx_ccx ( cx) . tcx , t) &&
2024
- action == DROP_EXISTING {
2023
+ if action == DROP_EXISTING &&
2024
+ ( type_is_structural_or_param ( bcx_tcx ( cx) , t) ||
2025
+ ty:: type_is_unique ( bcx_tcx ( cx) , t) ) {
2025
2026
let do_copy_cx = new_sub_block_ctxt ( cx, "do_copy" ) ;
2026
2027
let next_cx = new_sub_block_ctxt ( cx, "next" ) ;
2028
+ let dstcmp = load_if_immediate ( cx, dst, t) ;
2027
2029
let self_assigning =
2028
- ICmp ( cx, lib:: llvm:: LLVMIntNE , PointerCast ( cx , dst , val_ty ( src ) ) ,
2029
- src) ;
2030
+ ICmp ( cx, lib:: llvm:: LLVMIntNE ,
2031
+ PointerCast ( cx , dstcmp , val_ty ( src ) ) , src) ;
2030
2032
CondBr ( cx, self_assigning, do_copy_cx. llbb , next_cx. llbb ) ;
2031
2033
do_copy_cx = copy_val_no_check ( do_copy_cx, action, dst, src, t) ;
2032
2034
Br ( do_copy_cx, next_cx. llbb ) ;
0 commit comments