From a5fdefe45ad1aeade840beaecfbf9063f1bf3d65 Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Sun, 24 Feb 2019 17:38:31 +0100 Subject: [PATCH] Fix trans_get_discriminant for uninhabited types --- src/base.rs | 2 +- src/trap.rs | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/base.rs b/src/base.rs index 32299aeb68cd..7aeae5509334 100644 --- a/src/base.rs +++ b/src/base.rs @@ -739,7 +739,7 @@ pub fn trans_get_discriminant<'a, 'tcx: 'a>( let layout = place.layout(); if layout.abi == layout::Abi::Uninhabited { - trap_unreachable(&mut fx.bcx); + return trap_unreachable_ret_value(fx, dest_layout); } match layout.variants { layout::Variants::Single { index } => { diff --git a/src/trap.rs b/src/trap.rs index d94a852153e4..d76e2728aeac 100644 --- a/src/trap.rs +++ b/src/trap.rs @@ -1,6 +1,4 @@ -use cranelift::prelude::*; - -use cranelift::codegen::ir::TrapCode; +use crate::prelude::*; /// Trap code: user0 pub fn trap_panic(bcx: &mut FunctionBuilder) { @@ -11,3 +9,10 @@ pub fn trap_panic(bcx: &mut FunctionBuilder) { pub fn trap_unreachable(bcx: &mut FunctionBuilder) { bcx.ins().trap(TrapCode::User(!0)); } + +pub fn trap_unreachable_ret_value<'tcx>(fx: &mut FunctionCx<'_, 'tcx, impl cranelift_module::Backend>, dest_layout: TyLayout<'tcx>) -> CValue<'tcx> { + let true_ = fx.bcx.ins().iconst(types::I32, 1); + fx.bcx.ins().trapnz(true_, TrapCode::User(!0)); + let zero = fx.bcx.ins().iconst(fx.pointer_type, 0); + CValue::ByRef(zero, dest_layout) +}