parent
							
								
									1305ca662f
								
							
						
					
					
						commit
						170282b2af
					
				|  | @ -557,6 +557,13 @@ pub fn (mut c Checker) infer_fn_generic_types(f ast.Fn, mut call_expr ast.CallEx | |||
| 					} | ||||
| 				} else if param.typ.has_flag(.variadic) { | ||||
| 					to_set = c.table.mktyp(arg.typ) | ||||
| 				} else if arg_sym.kind == .struct_ && param.typ.has_flag(.generic) { | ||||
| 					info := arg_sym.info as ast.Struct | ||||
| 					generic_names := info.generic_types.map(c.table.get_type_symbol(it).name) | ||||
| 					if gt_name in generic_names { | ||||
| 						idx := generic_names.index(gt_name) | ||||
| 						typ = info.concrete_types[idx] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,19 @@ | |||
| struct Node<T> { | ||||
| 	data T | ||||
| } | ||||
| 
 | ||||
| fn foo<T>(n Node<T>) string { | ||||
| 	return '$n' | ||||
| } | ||||
| 
 | ||||
| fn test_generics_fn_infer_struct() { | ||||
| 	ret1 := foo(Node<int>{}) | ||||
| 	println(ret1) | ||||
| 	assert ret1.contains('Node<int>{') | ||||
| 	assert ret1.contains('data: 0') | ||||
| 
 | ||||
| 	ret2 := foo(Node<byte>{}) | ||||
| 	println(ret2) | ||||
| 	assert ret2.contains('Node<byte>{') | ||||
| 	assert ret2.contains('data: 0') | ||||
| } | ||||
		Loading…
	
		Reference in New Issue