Skip to content

Commit

Permalink
Abort instead of UB if promotion fails
Browse files Browse the repository at this point in the history
  • Loading branch information
oli-obk committed Jul 20, 2018
1 parent 3bea4d1 commit 7064f69
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions src/librustc_codegen_llvm/mir/operand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use rustc_data_structures::indexed_vec::Idx;
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;
Expand Down Expand Up @@ -411,7 +411,10 @@ impl<'a, 'tcx> FunctionCx<'a, 'tcx> {
.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(
Expand All @@ -420,10 +423,12 @@ impl<'a, 'tcx> FunctionCx<'a, 'tcx> {
);
},
}
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)
Expand Down

0 comments on commit 7064f69

Please sign in to comment.