When converting a float to an int, NaN produces bad conversion to integer, other out-of-bounds failures produce integer overflow. ¯\_(ツ)_/¯

This commit is contained in:
Nick Lewycky
2020-05-13 15:07:09 -07:00
parent 9d3162f578
commit d23dbaa3fa
2 changed files with 11 additions and 4 deletions

View File

@ -749,11 +749,14 @@ fn trap_if_not_representable_as_int<'ctx>(
builder.build_conditional_branch(out_of_bounds, failure_block, continue_block);
builder.position_at_end(failure_block);
builder.build_call(
intrinsics.throw_trap,
&[intrinsics.trap_illegal_arithmetic],
"throw",
let is_nan = builder.build_float_compare(FloatPredicate::UNO, value, value, "is_nan");
let trap_code = builder.build_select(
is_nan,
intrinsics.trap_bad_conversion_to_integer,
intrinsics.trap_illegal_arithmetic,
"",
);
builder.build_call(intrinsics.throw_trap, &[trap_code], "throw");
builder.build_unreachable();
builder.position_at_end(continue_block);
}