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