diff --git a/vlib/v/gen/c/auto_eq_methods.v b/vlib/v/gen/c/auto_eq_methods.v index 9fe60bc8d8..f21280b59f 100644 --- a/vlib/v/gen/c/auto_eq_methods.v +++ b/vlib/v/gen/c/auto_eq_methods.v @@ -155,6 +155,9 @@ fn (mut g Gen) gen_struct_equality_fn(left_type ast.Type) string { fn_builder.write_string('${eq_fn}_alias_eq(a.$field_name, b.$field_name)') } else if field_type.sym.kind == .function { fn_builder.write_string('*((voidptr*)(a.$field_name)) == *((voidptr*)(b.$field_name))') + } else if field_type.sym.kind == .interface_ { + eq_fn := g.gen_interface_equality_fn(field.typ) + fn_builder.write_string('${eq_fn}_interface_eq(a.$field_name, b.$field_name)') } else { fn_builder.write_string('a.$field_name == b.$field_name') } diff --git a/vlib/v/tests/struct_auto_eq_gen_interface_test.v b/vlib/v/tests/struct_auto_eq_gen_interface_test.v new file mode 100644 index 0000000000..69dfca5afe --- /dev/null +++ b/vlib/v/tests/struct_auto_eq_gen_interface_test.v @@ -0,0 +1,23 @@ +interface IExample { + thing() bool +} + +struct Foo {} + +fn (n Foo) thing() bool { + return true +} + +struct Test { + a IExample +} + +fn new() Test { + return Test{Foo{}} +} + +fn test_struct_auto_eq_gen_interface_case() { + w1 := new() + w2 := new() + assert w1 == w2 +}