Skip to content

Commit 460f7c6

Browse files
authored
cgen: fix fixed array of interfaces equality (#12908)
1 parent 9f7d71d commit 460f7c6

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

vlib/v/gen/c/auto_eq_methods.v

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,9 @@ fn (mut g Gen) gen_alias_equality_fn(left_type ast.Type) string {
191191
} else if sym.kind == .struct_ && !left.typ.is_ptr() {
192192
eq_fn := g.gen_struct_equality_fn(info.parent_type)
193193
fn_builder.writeln('\treturn ${eq_fn}_struct_eq(a, b);')
194+
} else if sym.kind == .interface_ && !left.typ.is_ptr() {
195+
eq_fn := g.gen_interface_equality_fn(info.parent_type)
196+
fn_builder.writeln('\treturn ${eq_fn}_interface_eq(a, b);')
194197
} else if sym.kind == .array && !left.typ.is_ptr() {
195198
eq_fn := g.gen_array_equality_fn(info.parent_type)
196199
fn_builder.writeln('\treturn ${eq_fn}_arr_eq(a, b);')
@@ -289,6 +292,9 @@ fn (mut g Gen) gen_fixed_array_equality_fn(left_type ast.Type) string {
289292
} else if elem.sym.kind == .struct_ && !elem.typ.is_ptr() {
290293
eq_fn := g.gen_struct_equality_fn(elem.typ)
291294
fn_builder.writeln('\t\tif (!${eq_fn}_struct_eq(a[i], b[i])) {')
295+
} else if elem.sym.kind == .interface_ && !elem.typ.is_ptr() {
296+
eq_fn := g.gen_interface_equality_fn(elem.typ)
297+
fn_builder.writeln('\t\tif (!${eq_fn}_interface_eq(a[i], b[i])) {')
292298
} else if elem.sym.kind == .array && !elem.typ.is_ptr() {
293299
eq_fn := g.gen_array_equality_fn(elem.typ)
294300
fn_builder.writeln('\t\tif (!${eq_fn}_arr_eq(a[i], b[i])) {')
@@ -364,6 +370,10 @@ fn (mut g Gen) gen_map_equality_fn(left_type ast.Type) string {
364370
eq_fn := g.gen_struct_equality_fn(value.typ)
365371
fn_builder.writeln('\t\tif (!${eq_fn}_struct_eq(*($ptr_value_styp*)map_get(&b, k, &($ptr_value_styp[]){ 0 }), v)) {')
366372
}
373+
.interface_ {
374+
eq_fn := g.gen_interface_equality_fn(value.typ)
375+
fn_builder.writeln('\t\tif (!${eq_fn}_interface_eq(*($ptr_value_styp*)map_get(&b, k, &($ptr_value_styp[]){ 0 }), v)) {')
376+
}
367377
.array {
368378
eq_fn := g.gen_array_equality_fn(value.typ)
369379
fn_builder.writeln('\t\tif (!${eq_fn}_arr_eq(*($ptr_value_styp*)map_get(&b, k, &($ptr_value_styp[]){ 0 }), v)) {')
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
interface IObject {
2+
foo()
3+
}
4+
5+
struct Foo {}
6+
7+
fn (f Foo) foo() {
8+
}
9+
10+
struct Array {
11+
mut:
12+
array [1]IObject
13+
}
14+
15+
fn (a Array) contains(x IObject) bool {
16+
for element in a.array {
17+
if element == x {
18+
return true
19+
}
20+
}
21+
return false
22+
}
23+
24+
fn test_fixed_array_of_interfaces_equality() {
25+
foo := Foo{}
26+
mut ary := Array{}
27+
ary.array[0] = foo
28+
ret := ary.contains(foo)
29+
println(ret)
30+
assert ret
31+
}

0 commit comments

Comments
 (0)