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