}
}
- pub fn destination(&self) -> Option<Lvalue<'tcx>> {
+ pub fn destination(&self) -> Option<&Lvalue<'tcx>> {
match *self {
CallKind::Converging { ref destination, .. } |
- CallKind::ConvergingCleanup { ref destination, .. } => Some(destination.clone()),
+ CallKind::ConvergingCleanup { ref destination, .. } => Some(destination),
+ CallKind::Diverging |
+ CallKind::DivergingCleanup(_) => None
+ }
+ }
+
+ pub fn destination_mut(&mut self) -> Option<&mut Lvalue<'tcx>> {
+ match *self {
+ CallKind::Converging { ref mut destination, .. } |
+ CallKind::ConvergingCleanup { ref mut destination, .. } => Some(destination),
CallKind::Diverging |
CallKind::DivergingCleanup(_) => None
}
*switch_ty = self.tcx.erase_regions(switch_ty);
},
Terminator::Call { ref mut func, ref mut args, ref mut kind } => {
- if let Some(ref mut destination) = kind.destination() {
+ if let Some(destination) = kind.destination_mut() {
self.erase_regions_lvalue(destination);
}
self.erase_regions_operand(func);
let mut llargs = Vec::with_capacity(args.len() + 1);
// Prepare the return value destination
- let (ret_dest_ty, must_copy_dest) = if let Some(ref d) = kind.destination() {
+ let (ret_dest_ty, must_copy_dest) = if let Some(d) = kind.destination() {
let dest = self.trans_lvalue(bcx, d);
let ret_ty = dest.ty.to_ty(bcx.tcx());
if type_of::return_uses_outptr(bcx.ccx(), ret_ty) {