checker: fix generic fn return types with generic struct (#12186)
							parent
							
								
									27cd21e459
								
							
						
					
					
						commit
						c108e01917
					
				|  | @ -699,6 +699,24 @@ fn (mut c Checker) unwrap_generic_type(typ ast.Type, generic_names []string, con | |||
| 			idx := c.table.find_or_register_array_with_dims(unwrap_typ, dims) | ||||
| 			return ast.new_type(idx).derive_add_muls(typ).clear_flag(.generic) | ||||
| 		} | ||||
| 		ast.ArrayFixed { | ||||
| 			unwrap_typ := c.unwrap_generic_type(ts.info.elem_type, generic_names, concrete_types) | ||||
| 			idx := c.table.find_or_register_array_fixed(unwrap_typ, ts.info.size, ast.None{}) | ||||
| 			return ast.new_type(idx).derive_add_muls(typ).clear_flag(.generic) | ||||
| 		} | ||||
| 		ast.Chan { | ||||
| 			unwrap_typ := c.unwrap_generic_type(ts.info.elem_type, generic_names, concrete_types) | ||||
| 			idx := c.table.find_or_register_chan(unwrap_typ, unwrap_typ.nr_muls() > 0) | ||||
| 			return ast.new_type(idx).derive_add_muls(typ).clear_flag(.generic) | ||||
| 		} | ||||
| 		ast.Map { | ||||
| 			unwrap_key_type := c.unwrap_generic_type(ts.info.key_type, generic_names, | ||||
| 				concrete_types) | ||||
| 			unwrap_value_type := c.unwrap_generic_type(ts.info.value_type, generic_names, | ||||
| 				concrete_types) | ||||
| 			idx := c.table.find_or_register_map(unwrap_key_type, unwrap_value_type) | ||||
| 			return ast.new_type(idx).derive_add_muls(typ).clear_flag(.generic) | ||||
| 		} | ||||
| 		ast.Struct, ast.Interface, ast.SumType { | ||||
| 			if !ts.info.is_generic { | ||||
| 				return typ | ||||
|  |  | |||
|  | @ -1,12 +0,0 @@ | |||
| pub struct Abcd<T> { | ||||
| } | ||||
| 
 | ||||
| pub fn iterators<T>() []&Abcd<T> { | ||||
| 	return []&Abcd<T>{} | ||||
| } | ||||
| 
 | ||||
| fn test_generic_fn_return_array_of_generic_struct() { | ||||
| 	a := iterators<f64>() | ||||
| 	println(a) | ||||
| 	assert '$a' == '[]' | ||||
| } | ||||
|  | @ -0,0 +1,32 @@ | |||
| struct Abcd<T> { | ||||
| } | ||||
| 
 | ||||
| fn iterators_array<T>() []&Abcd<T> { | ||||
| 	return []&Abcd<T>{} | ||||
| } | ||||
| 
 | ||||
| fn test_generic_fn_return_array_of_generic_struct() { | ||||
| 	a := iterators_array<f64>() | ||||
| 	println(a) | ||||
| 	assert '$a' == '[]' | ||||
| } | ||||
| 
 | ||||
| fn iterators_chan<T>() chan Abcd<T> { | ||||
| 	return chan Abcd<T>{} | ||||
| } | ||||
| 
 | ||||
| fn test_generic_fn_return_chan_of_generic_struct() { | ||||
| 	a := iterators_chan<f64>() | ||||
| 	println(a) | ||||
| 	assert typeof(a).name == 'chan Abcd<f64>' | ||||
| } | ||||
| 
 | ||||
| fn iterators_map<T>() map[string]&Abcd<T> { | ||||
| 	return map[string]&Abcd<T>{} | ||||
| } | ||||
| 
 | ||||
| fn test_generic_fn_return_map_of_generic_struct() { | ||||
| 	a := iterators_map<f64>() | ||||
| 	println(a) | ||||
| 	assert '$a' == '{}' | ||||
| } | ||||
		Loading…
	
		Reference in New Issue