crash upon integer overflow

This commit is contained in:
Folkert 2020-09-20 17:01:00 +02:00
parent 16fc5dd497
commit f732eb3e83
7 changed files with 107 additions and 6 deletions

View file

@ -274,6 +274,26 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
unique_function(vec![num_type(u, num), num_type(v, num)], num_type(w, num))
});
// addChecked or (+) : Num a, Num a -> Result (Num a) [ IntOverflow ]*
let int_overflow = SolvedType::TagUnion(
vec![(TagName::Global("IntOverflow".into()), vec![])],
Box::new(SolvedType::Wildcard),
);
add_type(Symbol::NUM_ADD_CHECKED, {
let_tvars! { u, v, w, num, result, star };
unique_function(
vec![num_type(u, num), num_type(v, num)],
result_type(result, num_type(w, num), lift(star, int_overflow)),
)
});
// addWrap or (+) : Int, Int -> Int
add_type(Symbol::NUM_ADD_WRAP, {
let_tvars! { u, v, w };
unique_function(vec![int_type(u), int_type(v)], int_type(w))
});
// sub or (-) : Num a, Num a -> Num a
add_type(Symbol::NUM_SUB, {
let_tvars! { u, v, w, num };