checker,cgen: fix generics with generic_fn type parameter (#10022)
							parent
							
								
									82a9add25b
								
							
						
					
					
						commit
						3dfbd2351b
					
				|  | @ -2276,7 +2276,7 @@ pub fn (mut c Checker) fn_call(mut call_expr ast.CallExpr) ast.Type { | ||||||
| 	if !found { | 	if !found { | ||||||
| 		if v := call_expr.scope.find_var(fn_name) { | 		if v := call_expr.scope.find_var(fn_name) { | ||||||
| 			if v.typ != 0 { | 			if v.typ != 0 { | ||||||
| 				vts := c.table.get_type_symbol(v.typ) | 				vts := c.table.get_type_symbol(c.unwrap_generic(v.typ)) | ||||||
| 				if vts.kind == .function { | 				if vts.kind == .function { | ||||||
| 					info := vts.info as ast.FnType | 					info := vts.info as ast.FnType | ||||||
| 					func = info.func | 					func = info.func | ||||||
|  |  | ||||||
|  | @ -371,18 +371,11 @@ fn (mut g Gen) fn_args(args []ast.Param, is_variadic bool) ([]string, []string) | ||||||
| 		if arg_type_sym.kind == .function { | 		if arg_type_sym.kind == .function { | ||||||
| 			info := arg_type_sym.info as ast.FnType | 			info := arg_type_sym.info as ast.FnType | ||||||
| 			func := info.func | 			func := info.func | ||||||
| 			if !info.is_anon { |  | ||||||
| 				g.write(arg_type_name + ' ' + caname) |  | ||||||
| 				g.definitions.write_string(arg_type_name + ' ' + caname) |  | ||||||
| 				fargs << caname |  | ||||||
| 				fargtypes << arg_type_name |  | ||||||
| 			} else { |  | ||||||
| 			g.write('${g.typ(func.return_type)} (*$caname)(') | 			g.write('${g.typ(func.return_type)} (*$caname)(') | ||||||
| 			g.definitions.write_string('${g.typ(func.return_type)} (*$caname)(') | 			g.definitions.write_string('${g.typ(func.return_type)} (*$caname)(') | ||||||
| 			g.fn_args(func.params, func.is_variadic) | 			g.fn_args(func.params, func.is_variadic) | ||||||
| 			g.write(')') | 			g.write(')') | ||||||
| 			g.definitions.write_string(')') | 			g.definitions.write_string(')') | ||||||
| 			} |  | ||||||
| 		} else { | 		} else { | ||||||
| 			s := '$arg_type_name $caname' | 			s := '$arg_type_name $caname' | ||||||
| 			g.write(s) | 			g.write(s) | ||||||
|  |  | ||||||
|  | @ -0,0 +1,34 @@ | ||||||
|  | fn neg(a int) int { | ||||||
|  | 	return -a | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn indirect_call(func fn (int) int, a int) int { | ||||||
|  | 	println(typeof(func).name) | ||||||
|  | 	return func(a) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn generic_call<T>(func T, a int) int { | ||||||
|  | 	println(T.name) | ||||||
|  | 	return func(a) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn generic_indirect_call<T>(func T, a int) int { | ||||||
|  | 	println(T.name) | ||||||
|  | 	return indirect_call(func, a) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn test_generics_with_generics_fn_type_parameter() { | ||||||
|  | 	mut ret := 0 | ||||||
|  | 
 | ||||||
|  | 	ret = indirect_call(neg, 2) | ||||||
|  | 	println(ret) | ||||||
|  | 	assert ret == -2 | ||||||
|  | 
 | ||||||
|  | 	ret = generic_call(neg, 3) | ||||||
|  | 	println(ret) | ||||||
|  | 	assert ret == -3 | ||||||
|  | 
 | ||||||
|  | 	ret = generic_indirect_call(neg, 4) | ||||||
|  | 	println(ret) | ||||||
|  | 	assert ret == -4 | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue