From cd5b304cbf35f07bdf5eb5974fe4e0365aad9368 Mon Sep 17 00:00:00 2001 From: 05st <60903484+05st@users.noreply.github.com> Date: Fri, 8 Oct 2021 11:04:24 -0500 Subject: [PATCH] cgen: add interface case for gen_struct_equality_fn (#12094) --- vlib/v/gen/c/auto_eq_methods.v | 3 +++ .../tests/struct_auto_eq_gen_interface_test.v | 23 +++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 vlib/v/tests/struct_auto_eq_gen_interface_test.v 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 +}