mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 14:54:47 +00:00
commit
00d9c240e7
6 changed files with 51 additions and 6 deletions
|
@ -294,6 +294,12 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// div : Int, Int -> Int
|
||||||
|
add_type(
|
||||||
|
Symbol::INT_DIV_UNSAFE,
|
||||||
|
SolvedType::Func(vec![int_type(), int_type()], Box::new(int_type())),
|
||||||
|
);
|
||||||
|
|
||||||
// mod : Int, Int -> Result Int [ DivByZero ]*
|
// mod : Int, Int -> Result Int [ DivByZero ]*
|
||||||
add_type(
|
add_type(
|
||||||
Symbol::INT_MOD,
|
Symbol::INT_MOD,
|
||||||
|
|
|
@ -348,9 +348,23 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
|
||||||
// lowest : Int
|
// lowest : Int
|
||||||
add_type(Symbol::INT_LOWEST, int_type(UVAR1));
|
add_type(Symbol::INT_LOWEST, int_type(UVAR1));
|
||||||
|
|
||||||
// div or (//) : Int, Int -> Int
|
// div or (//) : Int, Int -> Result Int [ DivByZero ]*
|
||||||
|
let div_by_zero = SolvedType::TagUnion(
|
||||||
|
vec![(TagName::Global("DivByZero".into()), vec![])],
|
||||||
|
Box::new(SolvedType::Wildcard),
|
||||||
|
);
|
||||||
|
|
||||||
add_type(
|
add_type(
|
||||||
Symbol::INT_DIV,
|
Symbol::INT_DIV,
|
||||||
|
unique_function(
|
||||||
|
vec![int_type(UVAR1), int_type(UVAR2)],
|
||||||
|
result_type(UVAR3, int_type(UVAR4), lift(UVAR5, div_by_zero)),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
// div or (//) : Int, Int -> Int
|
||||||
|
add_type(
|
||||||
|
Symbol::INT_DIV_UNSAFE,
|
||||||
unique_function(vec![int_type(UVAR1), int_type(UVAR2)], int_type(UVAR3)),
|
unique_function(vec![int_type(UVAR1), int_type(UVAR2)], int_type(UVAR3)),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -1226,6 +1226,17 @@ fn call_with_args<'a, 'ctx, 'env>(
|
||||||
Symbol::FLOAT_ROUND => call_intrinsic(LLVM_LROUND_I64_F64, env, args),
|
Symbol::FLOAT_ROUND => call_intrinsic(LLVM_LROUND_I64_F64, env, args),
|
||||||
Symbol::LIST_SET => list_set(parent, args, env, InPlace::Clone),
|
Symbol::LIST_SET => list_set(parent, args, env, InPlace::Clone),
|
||||||
Symbol::LIST_SET_IN_PLACE => list_set(parent, args, env, InPlace::InPlace),
|
Symbol::LIST_SET_IN_PLACE => list_set(parent, args, env, InPlace::InPlace),
|
||||||
|
Symbol::INT_DIV_UNSAFE => {
|
||||||
|
debug_assert!(args.len() == 2);
|
||||||
|
|
||||||
|
let int_val = env.builder.build_int_signed_div(
|
||||||
|
args[0].0.into_int_value(),
|
||||||
|
args[1].0.into_int_value(),
|
||||||
|
"div_i64",
|
||||||
|
);
|
||||||
|
|
||||||
|
BasicValueEnum::IntValue(int_val)
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
let fn_val = env
|
let fn_val = env
|
||||||
.module
|
.module
|
||||||
|
|
|
@ -159,6 +159,19 @@ mod gen_builtins {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn gen_div_i64() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
Int.divUnsafe 1000 100
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
10,
|
||||||
|
i64
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn gen_order_of_arithmetic_ops() {
|
fn gen_order_of_arithmetic_ops() {
|
||||||
assert_evals_to!(
|
assert_evals_to!(
|
||||||
|
|
|
@ -599,6 +599,7 @@ define_builtins! {
|
||||||
9 INT_EQ_I64: "#eqi64" // Equality on 64-bit integers, the standard in Roc
|
9 INT_EQ_I64: "#eqi64" // Equality on 64-bit integers, the standard in Roc
|
||||||
10 INT_EQ_I1: "#eqi1" // Equality on boolean (theoretically i1) values
|
10 INT_EQ_I1: "#eqi1" // Equality on boolean (theoretically i1) values
|
||||||
11 INT_EQ_I8: "#eqi8" // Equality on byte (theoretically i8) values
|
11 INT_EQ_I8: "#eqi8" // Equality on byte (theoretically i8) values
|
||||||
|
12 INT_DIV_UNSAFE: "divUnsafe" // TODO remove once we can code gen Result
|
||||||
}
|
}
|
||||||
3 FLOAT: "Float" => {
|
3 FLOAT: "Float" => {
|
||||||
0 FLOAT_FLOAT: "Float" imported // the Float.Float type alias
|
0 FLOAT_FLOAT: "Float" imported // the Float.Float type alias
|
||||||
|
|
|
@ -1944,7 +1944,7 @@ mod test_uniq_solve {
|
||||||
Int.highest // Int.highest
|
Int.highest // Int.highest
|
||||||
"#
|
"#
|
||||||
),
|
),
|
||||||
"Attr * Int",
|
"Attr * (Result (Attr * Int) (Attr * [ DivByZero ]*))",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1956,7 +1956,7 @@ mod test_uniq_solve {
|
||||||
3 // 4
|
3 // 4
|
||||||
"#
|
"#
|
||||||
),
|
),
|
||||||
"Attr * Int",
|
"Attr * (Result (Attr * Int) (Attr * [ DivByZero ]*))",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1968,7 +1968,7 @@ mod test_uniq_solve {
|
||||||
3 // Int.highest
|
3 // Int.highest
|
||||||
"#
|
"#
|
||||||
),
|
),
|
||||||
"Attr * Int",
|
"Attr * (Result (Attr * Int) (Attr * [ DivByZero ]*))",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2097,8 +2097,8 @@ mod test_uniq_solve {
|
||||||
reverse
|
reverse
|
||||||
"#
|
"#
|
||||||
),
|
),
|
||||||
// "Attr * (Attr * (List (Attr (a | b) c)) -> Attr (* | a | b) (List (Attr b c)))",
|
"Attr * (Attr * (List (Attr (a | b) c)) -> Attr (* | a | b) (List (Attr b c)))",
|
||||||
"Attr * (Attr * (List (Attr (a | b) c)) -> Attr (* | a | b) (List (Attr a c)))",
|
// "Attr * (Attr * (List (Attr (a | b) c)) -> Attr (* | a | b) (List (Attr a c)))",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue