From e310513a5f3276e1c6c4f7cb5678fa7cf5c77c85 Mon Sep 17 00:00:00 2001 From: yuyi Date: Tue, 11 May 2021 14:24:23 +0800 Subject: [PATCH] cgen: fix generics with generics fn type parameter (#10078) --- vlib/v/gen/c/cgen.v | 2 +- ...ics_with_generics_fn_type_parameter_test.v | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index f1c8de544c..d47fb34c60 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -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 diff --git a/vlib/v/tests/generics_with_generics_fn_type_parameter_test.v b/vlib/v/tests/generics_with_generics_fn_type_parameter_test.v index d5a0267187..a59db4b2b1 100644 --- a/vlib/v/tests/generics_with_generics_fn_type_parameter_test.v +++ b/vlib/v/tests/generics_with_generics_fn_type_parameter_test.v @@ -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(func T, a int) int { println(T.name) + assert T.name == typeof(neg).name return func(a) } fn generic_indirect_call(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(func T, a int) int { + f := func + assert typeof(f).name == typeof(neg).name + return f(a) +} + +fn generic_indirect_call_v2(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 }