let bcx = match dest {
expr::SaveIn(_) => bcx,
expr::Ignore => {
- glue::drop_ty(bcx, llresult, result_ty, debug_loc)
+ let bcx = glue::drop_ty(bcx, llresult, result_ty, debug_loc);
+ if !type_is_zero_size(ccx, result_ty) {
+ call_lifetime_end(bcx, llresult);
+ }
+ bcx
}
};
-> Block<'blk, 'tcx> {
// No cleanup is scheduled for an rvalue, so we don't have
// to do anything after a move to cancel or duplicate it.
+ if self.is_by_ref() {
+ call_lifetime_end(bcx, _val);
+ }
bcx
}
ByValue => DatumBlock::new(bcx, self),
ByRef => {
let llval = load_ty(bcx, self.val, self.ty);
+ call_lifetime_end(bcx, self.val);
DatumBlock::new(bcx, Datum::new(llval, self.ty, Rvalue::new(ByValue)))
}
}
dest
};
- fcx.pop_custom_cleanup_scope(cleanup_scope);
+ fcx.scopes.borrow_mut().last_mut().unwrap().drop_non_lifetime_clean();
+ fcx.pop_and_trans_custom_cleanup_scope(bcx, cleanup_scope);
return match dest {
expr::SaveIn(d) => Result::new(bcx, d),
false,
RustIntrinsic);
- fcx.pop_custom_cleanup_scope(cleanup_scope);
+ fcx.scopes.borrow_mut().last_mut().unwrap().drop_non_lifetime_clean();
let call_debug_location = DebugLoc::At(call_info.id, call_info.span);
if name.get() == "abort" {
let llfn = ccx.get_intrinsic(&("llvm.trap"));
Call(bcx, llfn, &[], None, call_debug_location);
+ fcx.pop_and_trans_custom_cleanup_scope(bcx, cleanup_scope);
Unreachable(bcx);
return Result::new(bcx, C_undef(Type::nil(ccx).ptr_to()));
} else if name.get() == "unreachable" {
+ fcx.pop_and_trans_custom_cleanup_scope(bcx, cleanup_scope);
Unreachable(bcx);
return Result::new(bcx, C_nil(ccx));
}
expr::SaveIn(_) => {}
}
+ fcx.pop_and_trans_custom_cleanup_scope(bcx, cleanup_scope);
+
Result::new(bcx, llresult)
}