From d55e73954a1019a1f5dea8fdca752b8f8e6647ff Mon Sep 17 00:00:00 2001 From: Mark Simulacrum Date: Mon, 19 Dec 2016 17:59:26 -0700 Subject: [PATCH] Do not use BAB after calling unreachable. This does not make unreachable and other terminators take self by-value because it is deemed too difficult. We would need to create by-value methods on BAB that call into Builder, due to the Deref to builder. --- src/librustc_trans/callee.rs | 24 +++++++++++++----------- src/librustc_trans/meth.rs | 10 +++++----- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/librustc_trans/callee.rs b/src/librustc_trans/callee.rs index 44e94a1dfe3..dea0a2664a0 100644 --- a/src/librustc_trans/callee.rs +++ b/src/librustc_trans/callee.rs @@ -385,13 +385,14 @@ fn trans_fn_once_adapter_shim<'a, 'tcx>( if fn_ret.0.is_never() { bcx.unreachable(); - } - self_scope.trans(&bcx); - - if fcx.fn_ty.ret.is_indirect() || fcx.fn_ty.ret.is_ignore() { - bcx.ret_void(); } else { - bcx.ret(llret); + self_scope.trans(&bcx); + + if fcx.fn_ty.ret.is_indirect() || fcx.fn_ty.ret.is_ignore() { + bcx.ret_void(); + } else { + bcx.ret(llret); + } } ccx.instances().borrow_mut().insert(method_instance, lloncefn); @@ -521,13 +522,14 @@ fn trans_fn_pointer_shim<'a, 'tcx>( if fn_ret.0.is_never() { bcx.unreachable(); - } - - if fn_ty.ret.is_indirect() || fcx.fn_ty.ret.is_ignore() { - bcx.ret_void(); } else { - bcx.ret(llret); + if fn_ty.ret.is_indirect() || fcx.fn_ty.ret.is_ignore() { + bcx.ret_void(); + } else { + bcx.ret(llret); + } } + ccx.fn_pointer_shims().borrow_mut().insert(bare_fn_ty_maybe_ref, llfn); llfn diff --git a/src/librustc_trans/meth.rs b/src/librustc_trans/meth.rs index df893ac7ab0..89ea7a760d4 100644 --- a/src/librustc_trans/meth.rs +++ b/src/librustc_trans/meth.rs @@ -102,12 +102,12 @@ pub fn trans_object_shim<'a, 'tcx>(ccx: &'a CrateContext<'a, 'tcx>, if fn_ret.0.is_never() { bcx.unreachable(); - } - - if fn_ty.ret.is_indirect() || fcx.fn_ty.ret.is_ignore() { - bcx.ret_void(); } else { - bcx.ret(llret); + if fn_ty.ret.is_indirect() || fcx.fn_ty.ret.is_ignore() { + bcx.ret_void(); + } else { + bcx.ret(llret); + } } llfn -- GitLab