checker, cgen: fix generic map with generic type key (#12859)
							parent
							
								
									1261468d8e
								
							
						
					
					
						commit
						d8a333058d
					
				|  | @ -4593,8 +4593,8 @@ pub fn (mut c Checker) map_init(mut node ast.MapInit) ast.Type { | ||||||
| 		info := c.table.get_type_symbol(node.typ).map_info() | 		info := c.table.get_type_symbol(node.typ).map_info() | ||||||
| 		c.ensure_type_exists(info.key_type, node.pos) or {} | 		c.ensure_type_exists(info.key_type, node.pos) or {} | ||||||
| 		c.ensure_type_exists(info.value_type, node.pos) or {} | 		c.ensure_type_exists(info.value_type, node.pos) or {} | ||||||
| 		node.key_type = c.unwrap_generic(info.key_type) | 		node.key_type = info.key_type | ||||||
| 		node.value_type = c.unwrap_generic(info.value_type) | 		node.value_type = info.value_type | ||||||
| 		return node.typ | 		return node.typ | ||||||
| 	} | 	} | ||||||
| 	if node.keys.len > 0 && node.vals.len > 0 { | 	if node.keys.len > 0 && node.vals.len > 0 { | ||||||
|  |  | ||||||
|  | @ -4794,10 +4794,12 @@ fn (mut g Gen) match_expr_classic(node ast.MatchExpr, is_expr bool, cond_var str | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn (mut g Gen) map_init(node ast.MapInit) { | fn (mut g Gen) map_init(node ast.MapInit) { | ||||||
| 	key_typ_str := g.typ(node.key_type) | 	unwrap_key_typ := g.unwrap_generic(node.key_type) | ||||||
| 	value_typ_str := g.typ(node.value_type) | 	unwrap_val_typ := g.unwrap_generic(node.value_type) | ||||||
| 	value_typ := g.table.get_type_symbol(node.value_type) | 	key_typ_str := g.typ(unwrap_key_typ) | ||||||
| 	key_typ := g.table.get_final_type_symbol(node.key_type) | 	value_typ_str := g.typ(unwrap_val_typ) | ||||||
|  | 	value_typ := g.table.get_type_symbol(unwrap_val_typ) | ||||||
|  | 	key_typ := g.table.get_final_type_symbol(unwrap_key_typ) | ||||||
| 	hash_fn, key_eq_fn, clone_fn, free_fn := g.map_fn_ptrs(key_typ) | 	hash_fn, key_eq_fn, clone_fn, free_fn := g.map_fn_ptrs(key_typ) | ||||||
| 	size := node.vals.len | 	size := node.vals.len | ||||||
| 	mut shared_styp := '' // only needed for shared &[]{...}
 | 	mut shared_styp := '' // only needed for shared &[]{...}
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,34 @@ | ||||||
|  | fn counts<T>(variables []T) map[T]int { | ||||||
|  | 	mut tally := map[T]int{} | ||||||
|  | 	for var in variables { | ||||||
|  | 		tally[var]++ | ||||||
|  | 	} | ||||||
|  | 	return tally | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn str_fn() { | ||||||
|  | 	a2 := ['1', '2', '3', '4', '5', '3', '1'] | ||||||
|  | 	ret := counts(a2) | ||||||
|  | 	println(ret) | ||||||
|  | 	assert ret.len == 5 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn int_fn() { | ||||||
|  | 	a1 := [1, 2, 3, 4, 5, 2, 3] | ||||||
|  | 	ret := counts(a1) | ||||||
|  | 	println(ret) | ||||||
|  | 	assert ret.len == 5 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn float_fn() { | ||||||
|  | 	a3 := [0.1, 0.02, 0.3, 4.0, 0.3] | ||||||
|  | 	ret := counts(a3) | ||||||
|  | 	println(ret) | ||||||
|  | 	assert ret.len == 4 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn test_generic_map_with_generic_type_key() { | ||||||
|  | 	str_fn() | ||||||
|  | 	float_fn() | ||||||
|  | 	int_fn() | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue