cgen: fix generics with generics fn type parameter (#10078)
							parent
							
								
									d60a55d30b
								
							
						
					
					
						commit
						e310513a5f
					
				| 
						 | 
				
			
			@ -2373,7 +2373,7 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
 | 
			
		|||
			}
 | 
			
		||||
			else {}
 | 
			
		||||
		}
 | 
			
		||||
		right_sym := g.table.get_type_symbol(val_type)
 | 
			
		||||
		right_sym := g.table.get_type_symbol(g.unwrap_generic(val_type))
 | 
			
		||||
		is_fixed_array_copy := right_sym.kind == .array_fixed && val is ast.Ident
 | 
			
		||||
		g.is_assign_lhs = true
 | 
			
		||||
		g.assign_op = assign_stmt.op
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,19 +4,40 @@ fn neg(a int) int {
 | 
			
		|||
 | 
			
		||||
fn indirect_call(func fn (int) int, a int) int {
 | 
			
		||||
	println(typeof(func).name)
 | 
			
		||||
	assert typeof(func).name == typeof(neg).name
 | 
			
		||||
	return func(a)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn generic_call<T>(func T, a int) int {
 | 
			
		||||
	println(T.name)
 | 
			
		||||
	assert T.name == typeof(neg).name
 | 
			
		||||
	return func(a)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn generic_indirect_call<T>(func T, a int) int {
 | 
			
		||||
	println(T.name)
 | 
			
		||||
	assert T.name == typeof(neg).name
 | 
			
		||||
	return indirect_call(func, a)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn indirect_call_v2(func fn (int) int, a int) int {
 | 
			
		||||
	f := func
 | 
			
		||||
	assert typeof(f).name == typeof(neg).name
 | 
			
		||||
	return f(a)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn generic_call_v2<T>(func T, a int) int {
 | 
			
		||||
	f := func
 | 
			
		||||
	assert typeof(f).name == typeof(neg).name
 | 
			
		||||
	return f(a)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn generic_indirect_call_v2<T>(func T, a int) int {
 | 
			
		||||
	f := func
 | 
			
		||||
	assert typeof(f).name == typeof(neg).name
 | 
			
		||||
	return indirect_call_v2(f, a)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_generics_with_generics_fn_type_parameter() {
 | 
			
		||||
	mut ret := 0
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -31,4 +52,16 @@ fn test_generics_with_generics_fn_type_parameter() {
 | 
			
		|||
	ret = generic_indirect_call(neg, 4)
 | 
			
		||||
	println(ret)
 | 
			
		||||
	assert ret == -4
 | 
			
		||||
 | 
			
		||||
	ret = indirect_call_v2(neg, 5)
 | 
			
		||||
	println(ret)
 | 
			
		||||
	assert ret == -5
 | 
			
		||||
 | 
			
		||||
	ret = generic_call_v2(neg, 6)
 | 
			
		||||
	println(ret)
 | 
			
		||||
	assert ret == -6
 | 
			
		||||
 | 
			
		||||
	ret = generic_indirect_call_v2(neg, 7)
 | 
			
		||||
	println(ret)
 | 
			
		||||
	assert ret == -7
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue