ast: add table.is_sumtype_or_in_variant() (#13615)
							parent
							
								
									81c787ef91
								
							
						
					
					
						commit
						efeb3e04da
					
				|  | @ -1284,6 +1284,17 @@ pub fn (t &Table) sumtype_has_variant(parent Type, variant Type, is_as bool) boo | |||
| 	return false | ||||
| } | ||||
| 
 | ||||
| pub fn (t &Table) is_sumtype_or_in_variant(parent Type, typ Type) bool { | ||||
| 	if typ == 0 { | ||||
| 		return false | ||||
| 	} | ||||
| 	if t.type_kind(typ) == .sum_type && parent.idx() == typ.idx() | ||||
| 		&& parent.nr_muls() == typ.nr_muls() { | ||||
| 		return true | ||||
| 	} | ||||
| 	return t.sumtype_has_variant(parent, typ, false) | ||||
| } | ||||
| 
 | ||||
| // only used for debugging V compiler type bugs
 | ||||
| pub fn (t &Table) known_type_names() []string { | ||||
| 	mut res := []string{cap: t.type_idxs.len} | ||||
|  |  | |||
|  | @ -847,15 +847,13 @@ pub fn (mut c Checker) infix_expr(mut node ast.InfixExpr) ast.Type { | |||
| 					return ast.void_type | ||||
| 				} else if left_value_sym.kind == .sum_type { | ||||
| 					if right_final.kind != .array { | ||||
| 						if left_value_type.idx() != right_type.idx() | ||||
| 							&& !c.table.sumtype_has_variant(left_value_type, right_type, false) { | ||||
| 						if !c.table.is_sumtype_or_in_variant(left_value_type, right_type) { | ||||
| 							c.error('cannot append `$right_sym.name` to `$left_sym.name`', | ||||
| 								right_pos) | ||||
| 						} | ||||
| 					} else { | ||||
| 						right_value_type := c.table.value_type(right_type) | ||||
| 						if left_value_type.idx() != right_value_type.idx() | ||||
| 							&& !c.table.sumtype_has_variant(left_value_type, right_value_type, false) { | ||||
| 						if !c.table.is_sumtype_or_in_variant(left_value_type, right_value_type) { | ||||
| 							c.error('cannot append `$right_sym.name` to `$left_sym.name`', | ||||
| 								right_pos) | ||||
| 						} | ||||
|  |  | |||
|  | @ -110,8 +110,7 @@ pub fn (mut c Checker) array_init(mut node ast.ArrayInit) ast.Type { | |||
| 				continue | ||||
| 			} else if expecting_sumtype_array { | ||||
| 				if i == 0 { | ||||
| 					if expected_value_type.idx() == typ.idx() | ||||
| 						|| c.table.sumtype_has_variant(expected_value_type, typ, false) { | ||||
| 					if c.table.is_sumtype_or_in_variant(expected_value_type, typ) { | ||||
| 						elem_type = expected_value_type | ||||
| 					} else { | ||||
| 						if expr.is_auto_deref_var() { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue