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
|
||||
}
|
||||
// sum type
|
||||
if c.table.sumtype_has_variant(expected, got) {
|
||||
if c.table.sumtype_has_variant(expected, c.table.mktyp(got)) {
|
||||
return true
|
||||
}
|
||||
// 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
|
||||
6 |
|
||||
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)
|
||||
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
|
||||
if expected_type != table.void_type {
|
||||
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