From 72c2dc805d2a3af799f2bd0aafc21ac4360ea35d Mon Sep 17 00:00:00 2001 From: yuyi Date: Thu, 14 Apr 2022 20:23:50 +0800 Subject: [PATCH] cgen: fix error for generics struct that parent has str to string (#14037) --- vlib/v/gen/c/auto_str_methods.v | 7 +++- ...ics_struct_parent_has_str_to_string_test.v | 36 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/generics_struct_parent_has_str_to_string_test.v diff --git a/vlib/v/gen/c/auto_str_methods.v b/vlib/v/gen/c/auto_str_methods.v index b1d8c4c605e170..8b746a7b4f43be 100644 --- a/vlib/v/gen/c/auto_str_methods.v +++ b/vlib/v/gen/c/auto_str_methods.v @@ -896,7 +896,12 @@ fn (mut g Gen) gen_str_for_struct(info ast.Struct, styp string, str_fn_name stri sftyp := g.typ(field.typ) mut field_styp := sftyp.replace('*', '') field_styp_fn_name := if sym_has_str_method { - '${field_styp}_str' + mut field_fn_name := '${field_styp}_str' + if sym.info is ast.Struct { + field_fn_name = g.generic_fn_name(sym.info.concrete_types, field_fn_name, + false) + } + field_fn_name } else { g.get_str_fn(field.typ) } diff --git a/vlib/v/tests/generics_struct_parent_has_str_to_string_test.v b/vlib/v/tests/generics_struct_parent_has_str_to_string_test.v new file mode 100644 index 00000000000000..c7ec2286708dd4 --- /dev/null +++ b/vlib/v/tests/generics_struct_parent_has_str_to_string_test.v @@ -0,0 +1,36 @@ +import datatypes + +const ( + w = 64 + h = 32 +) + +interface Display { +mut: + pixel(x int, y int, val bool) + clear() + refresh() +} + +struct Vm { +mut: + display Display + stack datatypes.Stack +} + +struct Pattern { + pattern []byte + handler fn (mut m Vm) +} + +fn new_pattern(pattern string, handler fn (mut m Vm)) Pattern { + return Pattern{pattern.runes().map(byte('0x$it'.int())), handler} +} + +fn test_generics_struct_parent_has_str_to_string() { + p := new_pattern('00E0', fn (mut m Vm) { + println(m) + }) + println(p) + assert true +}