implement mono / lowering for tuples

This commit is contained in:
Joshua Warner 2023-01-24 20:23:17 -08:00
parent 65f8bb3d0d
commit 5a6be05ead
No known key found for this signature in database
GPG key ID: 89AD497003F93FDD
42 changed files with 1773 additions and 290 deletions

View file

@ -0,0 +1,620 @@
#[cfg(feature = "gen-llvm")]
use crate::helpers::llvm::assert_evals_to;
#[cfg(feature = "gen-dev")]
use crate::helpers::dev::assert_evals_to;
#[cfg(feature = "gen-wasm")]
use crate::helpers::wasm::assert_evals_to;
// use crate::assert_wasm_evals_to as assert_evals_to;
use indoc::indoc;
#[cfg(all(test, any(feature = "gen-llvm", feature = "gen-wasm")))]
use roc_std::RocStr;
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn basic_tuple() {
assert_evals_to!(
indoc!(
r#"
( 15, 17, 19 ).0
"#
),
15,
i64
);
assert_evals_to!(
indoc!(
r#"
( 15, 17, 19 ).1
"#
),
17,
i64
);
assert_evals_to!(
indoc!(
r#"
( 15, 17, 19 ).2
"#
),
19,
i64
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn f64_tuple() {
assert_evals_to!(
indoc!(
r#"
tup = (17.2, 15.1, 19.3)
tup.0
"#
),
17.2,
f64
);
assert_evals_to!(
indoc!(
r#"
tup = (17.2, 15.1, 19.3)
tup.1
"#
),
15.1,
f64
);
assert_evals_to!(
indoc!(
r#"
tup = (17.2, 15.1, 19.3)
tup.2
"#
),
19.3,
f64
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn fn_tuple() {
assert_evals_to!(
indoc!(
r#"
getRec = \x -> ("foo", x, 19)
(getRec 15).1
"#
),
15,
i64
);
assert_evals_to!(
indoc!(
r#"
rec = (15, 17, 19)
rec.2 + rec.0
"#
),
34,
i64
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn int_tuple() {
assert_evals_to!(
indoc!(
r#"
rec = (15, 17, 19)
rec.0
"#
),
15,
i64
);
assert_evals_to!(
indoc!(
r#"
rec = (15, 17, 19)
rec.1
"#
),
17,
i64
);
assert_evals_to!(
indoc!(
r#"
rec = (15, 17, 19)
rec.2
"#
),
19,
i64
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn when_on_tuple() {
assert_evals_to!(
indoc!(
r#"
when (0x2, 0x3) is
(x, y) -> x + y
"#
),
5,
i64
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn when_tuple_with_guard_pattern() {
assert_evals_to!(
indoc!(
r#"
when (0x2, 1.23) is
(var, _) -> var + 3
"#
),
5,
i64
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn let_with_tuple_pattern() {
assert_evals_to!(
indoc!(
r#"
(x, _ ) = (0x2, 1.23)
x
"#
),
2,
i64
);
assert_evals_to!(
indoc!(
r#"
(_, y) = (0x2, 0x3)
y
"#
),
3,
i64
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn tuple_guard_pattern() {
assert_evals_to!(
indoc!(
r#"
when (0x2, 1.23) is
(0x4, _) -> 5
(x, _) -> x + 4
"#
),
6,
i64
);
assert_evals_to!(
indoc!(
r#"
when (0x2, 0x3) is
(_, 0x4) -> 5
(_, x) -> x + 4
"#
),
7,
i64
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn twice_tuple_access() {
assert_evals_to!(
indoc!(
r#"
x = (0x2, 0x3)
x.0 + x.1
"#
),
5,
i64
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm", feature = "gen-dev"))]
fn i64_tuple2_literal() {
assert_evals_to!(
indoc!(
r#"
(3, 5)
"#
),
(3, 5),
(i64, i64)
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn i64_tuple3_literal() {
assert_evals_to!(
indoc!(
r#"
(3, 5, 17)
"#
),
(3, 5, 17),
(i64, i64, i64)
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm", feature = "gen-dev"))]
fn f64_tuple2_literal() {
assert_evals_to!(
indoc!(
r#"
(3.1, 5.1)
"#
),
(3.1, 5.1),
(f64, f64)
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn bool_tuple4_literal() {
assert_evals_to!(
indoc!(
r#"
tuple : (Bool, Bool, Bool, Bool)
tuple = (Bool.true, Bool.false, Bool.false, Bool.true)
tuple
"#
),
(true, false, false, true),
(bool, bool, bool, bool)
);
}
// Not supported by wasm because of the size of the tuple:
// FromWasm32Memory is only implemented for tuples of up to 4 elements
#[test]
#[cfg(any(feature = "gen-llvm"))]
fn i64_tuple9_literal() {
assert_evals_to!(
indoc!(
r#"
( 3, 5, 17, 1, 9, 12, 13, 14, 15 )
"#
),
[3, 5, 17, 1, 9, 12, 13, 14, 15],
[i64; 9]
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm", feature = "gen-dev"))]
fn return_tuple() {
assert_evals_to!(
indoc!(
r#"
x = 4
y = 3
(x, y)
"#
),
(4, 3),
(i64, i64)
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm", feature = "gen-dev"))]
fn return_tuple_2() {
assert_evals_to!(
indoc!(
r#"
(3, 5)
"#
),
[3, 5],
[i64; 2]
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm", feature = "gen-dev"))]
fn return_tuple_3() {
assert_evals_to!(
indoc!(
r#"
( 3, 5, 4 )
"#
),
(3, 5, 4),
(i64, i64, i64)
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm", feature = "gen-dev"))]
fn return_tuple_4() {
assert_evals_to!(
indoc!(
r#"
( 3, 5, 4, 2 )
"#
),
[3, 5, 4, 2],
[i64; 4]
);
}
// Not supported by wasm because of the size of the tuple:
// FromWasm32Memory is only implemented for tuples of up to 4 elements
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev"))]
fn return_tuple_5() {
assert_evals_to!(
indoc!(
r#"
( 3, 5, 4, 2, 1 )
"#
),
[3, 5, 4, 2, 1],
[i64; 5]
);
}
// Not supported by wasm because of the size of the tuple:
// FromWasm32Memory is only implemented for tuples of up to 4 elements
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev"))]
fn return_tuple_6() {
assert_evals_to!(
indoc!(
r#"
( 3, 5, 4, 2, 1, 7 )
"#
),
[3, 5, 4, 2, 1, 7],
[i64; 6]
);
}
// Not supported by wasm because of the size of the tuple:
// FromWasm32Memory is only implemented for tuples of up to 4 elements
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev"))]
fn return_tuple_7() {
assert_evals_to!(
indoc!(
r#"
( 3, 5, 4, 2, 1, 7, 8 )
"#
),
[3, 5, 4, 2, 1, 7, 8],
[i64; 7]
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn return_tuple_float_int() {
assert_evals_to!(
indoc!(
r#"
(1.23, 0x1)
"#
),
(1.23, 0x1),
(f64, i64)
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn return_tuple_int_float() {
assert_evals_to!(
indoc!(
r#"
( 0x1, 1.23 )
"#
),
(0x1, 1.23),
(i64, f64)
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn return_tuple_float_float() {
assert_evals_to!(
indoc!(
r#"
( 2.46, 1.23 )
"#
),
(2.46, 1.23),
(f64, f64)
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn return_tuple_float_float_float() {
assert_evals_to!(
indoc!(
r#"
( 2.46, 1.23, 0.1 )
"#
),
(2.46, 1.23, 0.1),
(f64, f64, f64)
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm", feature = "gen-dev"))]
fn return_nested_tuple() {
assert_evals_to!(
indoc!(
r#"
(0x0, (2.46, 1.23, 0.1))
"#
),
(0x0, (2.46, 1.23, 0.1)),
(i64, (f64, f64, f64))
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn nested_tuple_load() {
assert_evals_to!(
indoc!(
r#"
x = (0, (0x2, 0x5, 0x6))
y = x.1
y.2
"#
),
6,
i64
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn tuple_accessor_twice() {
assert_evals_to!(".0 (4, 5) + .1 ( 2.46, 3 ) ", 7, i64);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn tuple_accessor_multi_element_tuple() {
assert_evals_to!(
indoc!(
r#"
.0 (4, "foo")
"#
),
4,
i64
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn booleans_in_tuple() {
assert_evals_to!(indoc!("(1 == 1, 1 == 1)"), (true, true), (bool, bool));
assert_evals_to!(indoc!("(1 != 1, 1 == 1)"), (false, true), (bool, bool));
assert_evals_to!(indoc!("(1 == 1, 1 != 1)"), (true, false), (bool, bool));
assert_evals_to!(indoc!("(1 != 1, 1 != 1)"), (false, false), (bool, bool));
}
// TODO: this test fails for mysterious reasons
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn alignment_in_tuple() {
assert_evals_to!(
indoc!("(32, 1 == 1, 78u16)"),
(32i64, 78u16, true),
(i64, u16, bool)
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn tuple_length_polymorphism() {
assert_evals_to!(
indoc!(
r#"
a = (42, 43)
b = (1, 2, 44)
f : (I64, I64)a, (I64, I64)b -> I64
f = \(x1, x2), (x3, x4) -> x1 + x2 + x3 + x4
f a b
"#
),
88,
i64
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn generalized_tuple_accessor() {
assert_evals_to!(
indoc!(
r#"
return0 = .0
return0 ("foo", 1)
"#
),
RocStr::from("foo"),
RocStr
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn generalized_explicit_tuple_accessor() {
assert_evals_to!(
indoc!(
r#"
return0 = \x -> x.0
return0 ("foo", 1)
"#
),
RocStr::from("foo"),
RocStr
);
}

View file

@ -17,6 +17,7 @@ pub mod gen_result;
pub mod gen_set;
pub mod gen_str;
pub mod gen_tags;
pub mod gen_tuples;
mod helpers;
pub mod wasm_str;