cgen: fix generics with generics fn type parameter (#10078)

pull/10081/head
yuyi 2021-05-11 14:24:23 +08:00 committed by GitHub
parent d60a55d30b
commit e310513a5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 1 deletions

View File

@ -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

View File

@ -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
}