From f3274700cd469166cc7fe5f5e3f5bcf2ac92c932 Mon Sep 17 00:00:00 2001 From: yuyi Date: Tue, 25 May 2021 12:45:54 +0800 Subject: [PATCH] cgen: fix generic struct to string (#10191) --- vlib/v/gen/c/auto_str_struct.v | 4 +-- vlib/v/tests/generics_struct_to_string_test.v | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 vlib/v/tests/generics_struct_to_string_test.v diff --git a/vlib/v/gen/c/auto_str_struct.v b/vlib/v/gen/c/auto_str_struct.v index 3b42ce202a..229157579d 100644 --- a/vlib/v/gen/c/auto_str_struct.v +++ b/vlib/v/gen/c/auto_str_struct.v @@ -94,12 +94,12 @@ fn (mut g Gen) gen_str_for_struct(info ast.Struct, styp string, str_fn_name stri for i, field in info.fields { mut ptr_amp := if field.typ.is_ptr() { '&' } else { '' } - base_fmt := g.type_to_fmt1(field.typ) + base_fmt := g.type_to_fmt1(g.unwrap_generic(field.typ)) // manage prefix and quote symbol for the filed mut quote_str := '' mut prefix := '' - sym := g.table.get_type_symbol(field.typ) + sym := g.table.get_type_symbol(g.unwrap_generic(field.typ)) if sym.kind == .string { quote_str = "'" } else if field.typ in ast.charptr_types { diff --git a/vlib/v/tests/generics_struct_to_string_test.v b/vlib/v/tests/generics_struct_to_string_test.v new file mode 100644 index 0000000000..7d6457b34a --- /dev/null +++ b/vlib/v/tests/generics_struct_to_string_test.v @@ -0,0 +1,33 @@ +struct Info { + data T +} + +fn get_info(res Info) string { + return '$res' +} + +fn test_generic_struct_to_string() { + mut ret := get_info(Info{true}) + println(ret) + assert ret.contains('data: true') + + ret = get_info(Info{123}) + println(ret) + assert ret.contains('data: 123') + + ret = get_info(Info{f32(2.2)}) + println(ret) + assert ret.contains('data: 2.2') + + ret = get_info(Info{2.2}) + println(ret) + assert ret.contains('data: 2.2') + + ret = get_info(Info{'aaa'}) + println(ret) + assert ret.contains("data: 'aaa'") + + ret = get_info(Info{u64(234)}) + println(ret) + assert ret.contains('data: 234') +}