From a186e445c73d3005220c440df35cc0c47d9cec12 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 20 Oct 2025 08:16:43 -0300 Subject: [PATCH] cgen: fix empty struct initializer for clang (fix #25467) (#25526) --- vlib/v/gen/c/auto_eq_methods.v | 6 ++++-- .../v/tests/structs/struct_empty_auto_eq_test.v | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 vlib/v/tests/structs/struct_empty_auto_eq_test.v diff --git a/vlib/v/gen/c/auto_eq_methods.v b/vlib/v/gen/c/auto_eq_methods.v index bcd87cac8..3f1aae526 100644 --- a/vlib/v/gen/c/auto_eq_methods.v +++ b/vlib/v/gen/c/auto_eq_methods.v @@ -542,14 +542,16 @@ fn (mut g Gen) gen_map_equality_fn(left_type ast.Type) string { fn_builder.writeln('\t\tif (!builtin__DenseArray_has_index(&${key_values}, i)) continue;') fn_builder.writeln('\t\tvoidptr k = builtin__DenseArray_key(&${key_values}, i);') fn_builder.writeln('\t\tif (!builtin__map_exists(${b}, k)) return false;') + sym := g.table.sym(value.typ) kind := g.table.type_kind(value.typ) + initializer := if !(sym.info is ast.Struct && sym.info.is_empty_struct()) { '0' } else { '' } if kind == .function { info := value.sym.info as ast.FnType sig := g.fn_var_signature(info.func.return_type, info.func.params.map(it.typ), 'v') fn_builder.writeln('\t\t${sig} = *(voidptr*)builtin__map_get(${a}, k, &(voidptr[]){ 0 });') } else { - fn_builder.writeln('\t\t${ptr_value_styp} v = *(${ptr_value_styp}*)builtin__map_get(${a}, k, &(${ptr_value_styp}[]){ 0 });') + fn_builder.writeln('\t\t${ptr_value_styp} v = *(${ptr_value_styp}*)builtin__map_get(${a}, k, &(${ptr_value_styp}[]){ ${initializer} });') } match kind { .string { @@ -561,7 +563,7 @@ fn (mut g Gen) gen_map_equality_fn(left_type ast.Type) string { } .struct { eq_fn := g.gen_struct_equality_fn(value.typ) - fn_builder.writeln('\t\tif (!${eq_fn}_struct_eq(*(${ptr_value_styp}*)builtin__map_get(${b}, k, &(${ptr_value_styp}[]){ 0 }), v)) {') + fn_builder.writeln('\t\tif (!${eq_fn}_struct_eq(*(${ptr_value_styp}*)builtin__map_get(${b}, k, &(${ptr_value_styp}[]){ ${initializer} }), v)) {') } .interface { eq_fn := g.gen_interface_equality_fn(value.typ) diff --git a/vlib/v/tests/structs/struct_empty_auto_eq_test.v b/vlib/v/tests/structs/struct_empty_auto_eq_test.v new file mode 100644 index 000000000..15220b5a3 --- /dev/null +++ b/vlib/v/tests/structs/struct_empty_auto_eq_test.v @@ -0,0 +1,17 @@ +module main + +struct Example {} + +struct Components { + example map[string]Example +} + +fn test_main() { + a := Components{} + b := Components{} + if a == b { + assert true + } else { + assert false + } +} -- 2.39.5