From 992b733e00025defec0fd062820257e068082c51 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 21 Apr 2026 15:13:08 +0300 Subject: [PATCH] cgen: fix println(struct) unhandled exception 0xc00000fd (fixes #19178) --- vlib/v/gen/c/auto_str_methods.v | 17 ++++++++- .../string_interpolation_struct_test.v | 38 +++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/vlib/v/gen/c/auto_str_methods.v b/vlib/v/gen/c/auto_str_methods.v index 4fce6384e..82dafbe72 100644 --- a/vlib/v/gen/c/auto_str_methods.v +++ b/vlib/v/gen/c/auto_str_methods.v @@ -483,8 +483,21 @@ fn (mut g Gen) gen_str_for_interface(info ast.Interface, styp string, typ_str st {_S("${clean_interface_v_type_name}("), ${si_s_code}, {.d_s = ${val}}, 0, 0, 0}, {_S(")"), 0, {0}, 0, 0, 0} }))' - fn_builder.write_string2('\tif (x._typ == _${styp}_${sub_sym.cname}_index)', - ' return ${res};\n') + if should_use_indent_func(sub_sym.kind) { + tmpvar := g.new_tmp_var() + fn_builder.writeln('\tif (x._typ == _${styp}_${sub_sym.cname}_index) {') + fn_builder.writeln('\t\tif (builtin__isnil(x._object) || builtin__autostr_addr_in_stack(x._object)) {') + fn_builder.writeln('\t\t\treturn builtin__isnil(x._object) ? _S("nil") : _S("");') + fn_builder.writeln('\t\t}') + fn_builder.writeln('\t\tbuiltin__autostr_addr_push(x._object);') + fn_builder.writeln('\t\tstring ${tmpvar} = ${res};') + fn_builder.writeln('\t\tbuiltin__autostr_addr_pop();') + fn_builder.writeln('\t\treturn ${tmpvar};') + fn_builder.writeln('\t}') + } else { + fn_builder.write_string2('\tif (x._typ == _${styp}_${sub_sym.cname}_index)', + ' return ${res};\n') + } } else { fn_builder.write_string2('\tif (x._typ == _${styp}_${sub_sym.cname}_index)', ' return _S("");\n') diff --git a/vlib/v/tests/builtin_strings_and_interpolation/string_interpolation_struct_test.v b/vlib/v/tests/builtin_strings_and_interpolation/string_interpolation_struct_test.v index 2eee2990d..69327d9d1 100644 --- a/vlib/v/tests/builtin_strings_and_interpolation/string_interpolation_struct_test.v +++ b/vlib/v/tests/builtin_strings_and_interpolation/string_interpolation_struct_test.v @@ -92,6 +92,44 @@ fn test_cross_reference_field_auto_str() { assert s == '&CrossRefWindow{| widgets: [CrossRefWidget{| parent: &CrossRefWindow{| widgets: [CrossRefWidget{| parent: &| }]| }| }]|}' } +interface FamilyMember { + name string + age u64 +} + +struct FamilySelf { +mut: + brothers []&FamilyMember + name string + age u64 +} + +struct FamilyBrother { +mut: + brothers []&FamilyMember + name string + age u64 +} + +fn test_cross_reference_interface_pointer_array_auto_str() { + mut me := &FamilySelf{ + name: 'Foo' + age: 33 + } + mut brother := &FamilyBrother{ + name: 'Bar' + age: 32 + } + me.brothers << brother + brother.brothers << me + s := '${me}' + assert s.contains('&FamilySelf{') + assert s.contains('brothers: [&FamilyMember(FamilyBrother{') + assert s.contains("name: 'Foo'") + assert s.contains("name: 'Bar'") + assert s.contains('brothers: [&]') +} + struct CircularArray { mut: children []CircularArray -- 2.39.5