mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 06:44:46 +00:00
throws subtraction overflow error for floats
This commit is contained in:
parent
59b850ba50
commit
5d2abc2bd2
2 changed files with 50 additions and 14 deletions
|
@ -3424,7 +3424,29 @@ fn build_float_binop<'a, 'ctx, 'env>(
|
||||||
struct_value.into()
|
struct_value.into()
|
||||||
}
|
}
|
||||||
NumAddWrap => unreachable!("wrapping addition is not defined on floats"),
|
NumAddWrap => unreachable!("wrapping addition is not defined on floats"),
|
||||||
NumSub => bd.build_float_sub(lhs, rhs, "sub_float").into(),
|
NumSub => {
|
||||||
|
let builder = env.builder;
|
||||||
|
let context = env.context;
|
||||||
|
|
||||||
|
let result = bd.build_float_sub(lhs, rhs, "sub_float");
|
||||||
|
|
||||||
|
let is_finite =
|
||||||
|
call_bitcode_fn(env, &[result.into()], &bitcode::NUM_IS_FINITE).into_int_value();
|
||||||
|
|
||||||
|
let then_block = context.append_basic_block(parent, "then_block");
|
||||||
|
let throw_block = context.append_basic_block(parent, "throw_block");
|
||||||
|
|
||||||
|
builder.build_conditional_branch(is_finite, then_block, throw_block);
|
||||||
|
|
||||||
|
builder.position_at_end(throw_block);
|
||||||
|
|
||||||
|
throw_exception(env, "float subtraction overflowed!");
|
||||||
|
|
||||||
|
builder.position_at_end(then_block);
|
||||||
|
|
||||||
|
result.into()
|
||||||
|
}
|
||||||
|
NumSubWrap => unreachable!("wrapping subtraction is not defined on floats"),
|
||||||
NumMul => bd.build_float_mul(lhs, rhs, "mul_float").into(),
|
NumMul => bd.build_float_mul(lhs, rhs, "mul_float").into(),
|
||||||
NumGt => bd.build_float_compare(OGT, lhs, rhs, "float_gt").into(),
|
NumGt => bd.build_float_compare(OGT, lhs, rhs, "float_gt").into(),
|
||||||
NumGte => bd.build_float_compare(OGE, lhs, rhs, "float_gte").into(),
|
NumGte => bd.build_float_compare(OGE, lhs, rhs, "float_gte").into(),
|
||||||
|
|
|
@ -704,19 +704,19 @@ mod gen_num {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// #[test]
|
#[test]
|
||||||
// #[should_panic(expected = r#"Roc failed with message: "float addition overflowed!"#)]
|
#[should_panic(expected = r#"Roc failed with message: "float addition overflowed!"#)]
|
||||||
// fn float_overflow() {
|
fn float_add_overflow() {
|
||||||
// assert_evals_to!(
|
assert_evals_to!(
|
||||||
// indoc!(
|
indoc!(
|
||||||
// r#"
|
r#"
|
||||||
// 1.7976931348623157e308 + 1.7976931348623157e308
|
1.7976931348623157e308 + 1.7976931348623157e308
|
||||||
// "#
|
"#
|
||||||
// ),
|
),
|
||||||
// 0.0,
|
0.0,
|
||||||
// f64
|
f64
|
||||||
// );
|
);
|
||||||
// }
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn num_max_int() {
|
fn num_max_int() {
|
||||||
|
@ -770,4 +770,18 @@ mod gen_num {
|
||||||
i64
|
i64
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic(expected = r#"Roc failed with message: "float subtraction overflowed!"#)]
|
||||||
|
fn float_sub_overflow() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
-1.7976931348623157e308 - 1.7976931348623157e308
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
0.0,
|
||||||
|
f64
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue