checker, cgen: allow using literals as `int` and `f64` for sum types (#7864)
parent
164d7bf5fb
commit
bf904c2f82
|
@ -123,7 +123,7 @@ pub fn (mut c Checker) check_basic(got table.Type, expected table.Type) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// sum type
|
// sum type
|
||||||
if c.table.sumtype_has_variant(expected, got) {
|
if c.table.sumtype_has_variant(expected, c.table.mktyp(got)) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// fn type
|
// fn type
|
||||||
|
|
|
@ -1,10 +1,3 @@
|
||||||
vlib/v/checker/tests/is_type_not_exist.vv:4:25: error: cannot use `int literal` as `Integer` in argument 1 to `fn_with_sum_type_param`
|
|
||||||
2 |
|
|
||||||
3 | fn main() {
|
|
||||||
4 | fn_with_sum_type_param(1)
|
|
||||||
| ^
|
|
||||||
5 | }
|
|
||||||
6 |
|
|
||||||
vlib/v/checker/tests/is_type_not_exist.vv:8:10: error: is: type `SomethingThatDontExist` does not exist
|
vlib/v/checker/tests/is_type_not_exist.vv:8:10: error: is: type `SomethingThatDontExist` does not exist
|
||||||
6 |
|
6 |
|
||||||
7 | fn fn_with_sum_type_param(i Integer) {
|
7 | fn fn_with_sum_type_param(i Integer) {
|
||||||
|
|
|
@ -1320,7 +1320,8 @@ fn (mut g Gen) for_in(it ast.ForInStmt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// use instead of expr() when you need to cast to union sum type (can add other casts also)
|
// use instead of expr() when you need to cast to union sum type (can add other casts also)
|
||||||
fn (mut g Gen) expr_with_cast(expr ast.Expr, got_type table.Type, expected_type table.Type) {
|
fn (mut g Gen) expr_with_cast(expr ast.Expr, got_type_raw table.Type, expected_type table.Type) {
|
||||||
|
got_type := g.table.mktyp(got_type_raw)
|
||||||
// cast to sum type
|
// cast to sum type
|
||||||
if expected_type != table.void_type {
|
if expected_type != table.void_type {
|
||||||
expected_is_ptr := expected_type.is_ptr()
|
expected_is_ptr := expected_type.is_ptr()
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
type Foo = f32 | f64 | i16 | int | u64
|
||||||
|
|
||||||
|
fn test_assign_cast() {
|
||||||
|
a := Foo(3)
|
||||||
|
b := Foo(3.0)
|
||||||
|
c := Foo(-7.25)
|
||||||
|
d := Foo(i16(-4))
|
||||||
|
e := Foo(f32(-0.0625))
|
||||||
|
assert a is int
|
||||||
|
assert b is f64
|
||||||
|
assert b !is int
|
||||||
|
assert c is f64
|
||||||
|
assert d is i16
|
||||||
|
assert e is f32
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_assign_mut() {
|
||||||
|
mut a := Foo(0)
|
||||||
|
mut b := Foo(i16(3))
|
||||||
|
mut c := Foo(f32(1))
|
||||||
|
a = 12.3
|
||||||
|
b = -123456
|
||||||
|
c = 33.
|
||||||
|
assert a is f64
|
||||||
|
assert b is int
|
||||||
|
assert c is f64
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_call_arg() {
|
||||||
|
assert get_type_idx(0.25) == 1
|
||||||
|
assert get_type_idx(-7) == 3
|
||||||
|
assert get_type_idx(u64(0)) == 4
|
||||||
|
assert get_type_idx(f32(-0.125e-7)) == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_type_idx(x Foo) int {
|
||||||
|
match x {
|
||||||
|
f32 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
f64 {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
i16 {
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
int {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
u64 {
|
||||||
|
return 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_sumtype_return() {
|
||||||
|
a := gen_foo(0)
|
||||||
|
b := gen_foo(1)
|
||||||
|
c := gen_foo(2)
|
||||||
|
d := gen_foo(3)
|
||||||
|
e := gen_foo(4)
|
||||||
|
assert a is f32
|
||||||
|
assert b is f64
|
||||||
|
assert c is f64
|
||||||
|
assert c !is int
|
||||||
|
assert d is i16
|
||||||
|
assert e is int
|
||||||
|
}
|
||||||
|
|
||||||
|
fn gen_foo(n int) Foo {
|
||||||
|
if n == 0 {
|
||||||
|
return f32(0.5)
|
||||||
|
}
|
||||||
|
if n == 1 {
|
||||||
|
return -17.3e23
|
||||||
|
}
|
||||||
|
if n == 2 {
|
||||||
|
return 32.
|
||||||
|
}
|
||||||
|
if n == 3 {
|
||||||
|
return i16(13)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
Loading…
Reference in New Issue