From 81bfea53e2c62c0c8c32c0890d33a9d7d6c3ca04 Mon Sep 17 00:00:00 2001 From: Folkert Date: Thu, 31 Dec 2020 21:36:49 +0100 Subject: [PATCH] fix some uniqueness problems --- compiler/builtins/src/unique.rs | 82 ++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 38 deletions(-) diff --git a/compiler/builtins/src/unique.rs b/compiler/builtins/src/unique.rs index 0b8d2fcf59..317715cf03 100644 --- a/compiler/builtins/src/unique.rs +++ b/compiler/builtins/src/unique.rs @@ -166,8 +166,8 @@ pub fn types() -> MutMap { // addWrap : 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)) + let_tvars! { u, v, w, int }; + unique_function(vec![int_type(u, int), int_type(v, int)], int_type(w, int)) }); // sub or (-) : Num a, Num a -> Num a @@ -199,8 +199,8 @@ pub fn types() -> MutMap { // mulWrap : Int, Int -> Int add_type(Symbol::NUM_MUL_WRAP, { - let_tvars! { u, v, w }; - unique_function(vec![int_type(u), int_type(v)], int_type(w)) + let_tvars! { u, v, w , int }; + unique_function(vec![int_type(u, int), int_type(v, int)], int_type(w, int)) }); // mulChecked : Num a, Num a -> Result (Num a) [ Overflow ]* @@ -257,38 +257,41 @@ pub fn types() -> MutMap { // rem : Attr * Int, Attr * Int -> Attr * (Result (Attr * Int) (Attr * [ DivByZero ]*)) add_type(Symbol::NUM_REM, { - let_tvars! { star1, star2, star3, star4, star5 }; + let_tvars! { star1, star2, star3, star4, star5, int }; unique_function( - vec![int_type(star1), int_type(star2)], - result_type(star3, int_type(star4), lift(star5, div_by_zero())), + vec![int_type(star1, int), int_type(star2, int)], + result_type(star3, int_type(star4, int), lift(star5, div_by_zero())), ) }); // maxInt : Int add_type(Symbol::NUM_MAX_INT, { - let_tvars! { star }; - int_type(star) + let_tvars! { star, int }; + int_type(star, int) }); // minInt : Int add_type(Symbol::NUM_MIN_INT, { - let_tvars! { star }; - int_type(star) + let_tvars! { star, int }; + int_type(star, int) }); // divFloor or (//) : Int, Int -> Result Int [ DivByZero ]* add_type(Symbol::NUM_DIV_INT, { - let_tvars! { star1, star2, star3, star4, star5 }; + let_tvars! { star1, star2, star3, star4, star5, int }; unique_function( - vec![int_type(star1), int_type(star2)], - result_type(star3, int_type(star4), lift(star5, div_by_zero())), + vec![int_type(star1, int), int_type(star2, int)], + result_type(star3, int_type(star4, int), lift(star5, div_by_zero())), ) }); // bitwiseAnd : Attr * Int, Attr * Int -> Attr * Int add_type(Symbol::NUM_BITWISE_AND, { - let_tvars! { star1, star2, star3 }; - unique_function(vec![int_type(star1), int_type(star2)], int_type(star3)) + let_tvars! { star1, star2, star3, int }; + unique_function( + vec![int_type(star1, int), int_type(star2, int)], + int_type(star3, int), + ) }); // divFloat : Float, Float -> Float @@ -302,8 +305,8 @@ pub fn types() -> MutMap { // round : Float -> Int add_type(Symbol::NUM_ROUND, { - let_tvars! { star1, star2 }; - unique_function(vec![float_type(star1)], int_type(star2)) + let_tvars! { star1, star2, int }; + unique_function(vec![float_type(star1)], int_type(star2, int)) }); // sqrt : Float -> Float @@ -391,20 +394,23 @@ pub fn types() -> MutMap { // ceiling : Float -> Int add_type(Symbol::NUM_CEILING, { - let_tvars! { star1, star2 }; - unique_function(vec![float_type(star1)], int_type(star2)) + let_tvars! { star1, star2, int }; + unique_function(vec![float_type(star1)], int_type(star2, int)) }); // powInt : Int, Int -> Int add_type(Symbol::NUM_POW_INT, { - let_tvars! { star1, star2, star3 }; - unique_function(vec![int_type(star1), int_type(star2)], int_type(star3)) + let_tvars! { star1, star2, star3 , int }; + unique_function( + vec![int_type(star1, int), int_type(star2, int)], + int_type(star3, int), + ) }); // floor : Float -> Int add_type(Symbol::NUM_FLOOR, { - let_tvars! { star1, star2 }; - unique_function(vec![float_type(star1)], int_type(star2)) + let_tvars! { star1, star2 , int}; + unique_function(vec![float_type(star1)], int_type(star2, int)) }); // atan : Float -> Float @@ -479,8 +485,8 @@ pub fn types() -> MutMap { // len : Attr * (List *) -> Attr * Int add_type(Symbol::LIST_LEN, { - let_tvars! { star1, a, star2 }; - unique_function(vec![list_type(star1, a)], int_type(star2)) + let_tvars! { star1, a, star2 , int }; + unique_function(vec![list_type(star1, a)], int_type(star2, int)) }); fn list_was_empty() -> SolvedType { @@ -536,7 +542,7 @@ pub fn types() -> MutMap { ); add_type(Symbol::LIST_GET, { - let_tvars! { a, u, star1, star2, star3, star4 }; + let_tvars! { a, u, star1, star2, star3, star4, int}; unique_function( vec![ @@ -547,7 +553,7 @@ pub fn types() -> MutMap { SolvedType::Apply(Symbol::LIST_LIST, vec![attr_type(u, a)]), ], ), - int_type(star2), + int_type(star2, int), ], result_type(star3, attr_type(u, a), lift(star4, index_out_of_bounds)), ) @@ -559,7 +565,7 @@ pub fn types() -> MutMap { // Attr (u | v) a // -> Attr * (List (Attr u a)) add_type(Symbol::LIST_SET, { - let_tvars! { u, v, w, star1, star2, a }; + let_tvars! { u, v, w, star1, star2, a, int}; unique_function( vec![ @@ -570,7 +576,7 @@ pub fn types() -> MutMap { SolvedType::Apply(Symbol::LIST_LIST, vec![attr_type(u, a)]), ], ), - int_type(star1), + int_type(star1, int), SolvedType::Apply(Symbol::ATTR_ATTR, vec![container(u, vec![v]), flex(a)]), ], SolvedType::Apply( @@ -627,10 +633,10 @@ pub fn types() -> MutMap { // , Attr Shared a // -> Attr * (List (Attr Shared a)) add_type(Symbol::LIST_REPEAT, { - let_tvars! { a, star1, star2 }; + let_tvars! { a, star1, star2, int }; unique_function( - vec![int_type(star1), shared(flex(a))], + vec![int_type(star1, int), shared(flex(a))], SolvedType::Apply( Symbol::ATTR_ATTR, vec![ @@ -1162,14 +1168,14 @@ pub fn types() -> MutMap { // Str.countGraphemes : Attr * Str, -> Attr * Int add_type(Symbol::STR_COUNT_GRAPHEMES, { - let_tvars! { star1, star2 }; - unique_function(vec![str_type(star1)], int_type(star2)) + let_tvars! { star1, star2, int }; + unique_function(vec![str_type(star1)], int_type(star2, int)) }); // fromInt : Attr * Int -> Attr * Str add_type(Symbol::STR_FROM_INT, { - let_tvars! { star1, star2 }; - unique_function(vec![int_type(star1)], str_type(star2)) + let_tvars! { star1, star2, int }; + unique_function(vec![int_type(star1, int)], str_type(star2)) }); // Result module @@ -1261,8 +1267,8 @@ fn float_type(u: VarId) -> SolvedType { } #[inline(always)] -fn int_type(u: VarId) -> SolvedType { - let inner_type = lift(u, flex(u)); +fn int_type(u: VarId, range: VarId) -> SolvedType { + let inner_type = lift(u, flex(range)); let integer = builtin_aliases::integer_type(inner_type.clone()); let attr_fb = lift(u, integer); let num = builtin_aliases::num_type(attr_fb);