]> git.lizzy.rs Git - rust.git/commitdiff
Abort instead of UB if promotion fails
authorOliver Schneider <github35764891676564198441@oli-obk.de>
Fri, 20 Jul 2018 16:43:46 +0000 (18:43 +0200)
committerOliver Schneider <github35764891676564198441@oli-obk.de>
Fri, 20 Jul 2018 17:00:48 +0000 (19:00 +0200)
src/librustc_codegen_llvm/mir/operand.rs

index 5d36eef99af2d393c8124c84a2fb31b49dd0552b..52234af08c1ab5d8f7103a0e9681dac27f9905e9 100644 (file)
@@ -18,7 +18,7 @@
 use rustc_data_structures::sync::Lrc;
 
 use base;
-use common::{CodegenCx, C_null, C_undef, C_usize};
+use common::{CodegenCx, C_undef, C_usize};
 use builder::{Builder, MemFlags};
 use value::Value;
 use type_of::LayoutLlvmExt;
@@ -411,7 +411,10 @@ pub fn codegen_operand(&mut self,
                     .unwrap_or_else(|err| {
                         match constant.literal {
                             mir::Literal::Promoted { .. } => {
-                                // FIXME: generate a panic here
+                                // this is unreachable as long as runtime
+                                // and compile-time agree on values
+                                // With floats that won't always be true
+                                // so we generate an abort below
                             },
                             mir::Literal::Value { .. } => {
                                 err.report_as_error(
@@ -420,10 +423,12 @@ pub fn codegen_operand(&mut self,
                                 );
                             },
                         }
+                        let fnname = bx.cx.get_intrinsic(&("llvm.trap"));
+                        bx.call(fnname, &[], None);
                         // We've errored, so we don't have to produce working code.
                         let layout = bx.cx.layout_of(ty);
                         PlaceRef::new_sized(
-                            C_null(layout.llvm_type(bx.cx).ptr_to()),
+                            C_undef(layout.llvm_type(bx.cx).ptr_to()),
                             layout,
                             layout.align,
                         ).load(bx)