]> git.lizzy.rs Git - rust.git/commitdiff
Fix trans_get_discriminant for uninhabited types
authorbjorn3 <bjorn3@users.noreply.github.com>
Sun, 24 Feb 2019 16:38:31 +0000 (17:38 +0100)
committerbjorn3 <bjorn3@users.noreply.github.com>
Wed, 6 Mar 2019 19:55:28 +0000 (20:55 +0100)
src/base.rs
src/trap.rs

index 32299aeb68cd53618428ede0107599919b080b6e..7aeae550933419b85834109528ccdc81eef06caa 100644 (file)
@@ -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 } => {
index d94a852153e456ec0f2058381f0a29df34cd99e9..d76e2728aeac74ae3a18f3f56fd39976b0e739ce 100644 (file)
@@ -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)
+}