ast, checker, cgen: fix array of sumtype initialisation with a default `init:` (#13178)
							parent
							
								
									7fe62a8b3e
								
							
						
					
					
						commit
						dfc23d939f
					
				| 
						 | 
				
			
			@ -1166,9 +1166,10 @@ pub:
 | 
			
		|||
	has_default   bool
 | 
			
		||||
	has_it        bool // true if temp variable it is used
 | 
			
		||||
pub mut:
 | 
			
		||||
	expr_types []Type // [Dog, Cat] // also used for interface_types
 | 
			
		||||
	elem_type  Type   // element type
 | 
			
		||||
	typ        Type   // array type
 | 
			
		||||
	expr_types   []Type // [Dog, Cat] // also used for interface_types
 | 
			
		||||
	elem_type    Type   // element type
 | 
			
		||||
	default_type Type   // default value type
 | 
			
		||||
	typ          Type   // array type
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub struct ArrayDecompose {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,7 @@ pub fn (mut c Checker) array_init(mut node ast.ArrayInit) ast.Type {
 | 
			
		|||
		if node.has_default {
 | 
			
		||||
			default_expr := node.default_expr
 | 
			
		||||
			default_typ := c.check_expr_opt_call(default_expr, c.expr(default_expr))
 | 
			
		||||
			node.default_type = default_typ
 | 
			
		||||
			c.check_expected(default_typ, node.elem_type) or {
 | 
			
		||||
				c.error(err.msg, default_expr.position())
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -213,7 +213,7 @@ fn (mut g Gen) array_init(node ast.ArrayInit) {
 | 
			
		|||
			g.write('}[0])')
 | 
			
		||||
		} else if node.has_default {
 | 
			
		||||
			g.write('&($elem_styp[]){')
 | 
			
		||||
			g.expr(node.default_expr)
 | 
			
		||||
			g.expr_with_cast(node.default_expr, node.default_type, node.elem_type)
 | 
			
		||||
			g.write('})')
 | 
			
		||||
		} else if node.has_len && node.elem_type == ast.string_type {
 | 
			
		||||
			g.write('&($elem_styp[]){')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
type Abc = int | string
 | 
			
		||||
 | 
			
		||||
fn test_array_of_sumtype_with_default() {
 | 
			
		||||
	a1 := []Abc{len: 1, init: 22}
 | 
			
		||||
	println(a1)
 | 
			
		||||
	assert '$a1' == '[Abc(22)]'
 | 
			
		||||
 | 
			
		||||
	a2 := []Abc{len: 1, init: 'hello'}
 | 
			
		||||
	println(a2)
 | 
			
		||||
	assert '$a2' == "[Abc('hello')]"
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue