mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
cgen: fix fixed array of interfaces equality (#12908)
This commit is contained in:
parent
9f7d71d338
commit
460f7c6637
@ -191,6 +191,9 @@ fn (mut g Gen) gen_alias_equality_fn(left_type ast.Type) string {
|
||||
} else if sym.kind == .struct_ && !left.typ.is_ptr() {
|
||||
eq_fn := g.gen_struct_equality_fn(info.parent_type)
|
||||
fn_builder.writeln('\treturn ${eq_fn}_struct_eq(a, b);')
|
||||
} else if sym.kind == .interface_ && !left.typ.is_ptr() {
|
||||
eq_fn := g.gen_interface_equality_fn(info.parent_type)
|
||||
fn_builder.writeln('\treturn ${eq_fn}_interface_eq(a, b);')
|
||||
} else if sym.kind == .array && !left.typ.is_ptr() {
|
||||
eq_fn := g.gen_array_equality_fn(info.parent_type)
|
||||
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 {
|
||||
} else if elem.sym.kind == .struct_ && !elem.typ.is_ptr() {
|
||||
eq_fn := g.gen_struct_equality_fn(elem.typ)
|
||||
fn_builder.writeln('\t\tif (!${eq_fn}_struct_eq(a[i], b[i])) {')
|
||||
} else if elem.sym.kind == .interface_ && !elem.typ.is_ptr() {
|
||||
eq_fn := g.gen_interface_equality_fn(elem.typ)
|
||||
fn_builder.writeln('\t\tif (!${eq_fn}_interface_eq(a[i], b[i])) {')
|
||||
} else if elem.sym.kind == .array && !elem.typ.is_ptr() {
|
||||
eq_fn := g.gen_array_equality_fn(elem.typ)
|
||||
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 {
|
||||
eq_fn := g.gen_struct_equality_fn(value.typ)
|
||||
fn_builder.writeln('\t\tif (!${eq_fn}_struct_eq(*($ptr_value_styp*)map_get(&b, k, &($ptr_value_styp[]){ 0 }), v)) {')
|
||||
}
|
||||
.interface_ {
|
||||
eq_fn := g.gen_interface_equality_fn(value.typ)
|
||||
fn_builder.writeln('\t\tif (!${eq_fn}_interface_eq(*($ptr_value_styp*)map_get(&b, k, &($ptr_value_styp[]){ 0 }), v)) {')
|
||||
}
|
||||
.array {
|
||||
eq_fn := g.gen_array_equality_fn(value.typ)
|
||||
fn_builder.writeln('\t\tif (!${eq_fn}_arr_eq(*($ptr_value_styp*)map_get(&b, k, &($ptr_value_styp[]){ 0 }), v)) {')
|
||||
|
31
vlib/v/tests/fixed_array_of_interfaces_equality_test.v
Normal file
31
vlib/v/tests/fixed_array_of_interfaces_equality_test.v
Normal file
@ -0,0 +1,31 @@
|
||||
interface IObject {
|
||||
foo()
|
||||
}
|
||||
|
||||
struct Foo {}
|
||||
|
||||
fn (f Foo) foo() {
|
||||
}
|
||||
|
||||
struct Array {
|
||||
mut:
|
||||
array [1]IObject
|
||||
}
|
||||
|
||||
fn (a Array) contains(x IObject) bool {
|
||||
for element in a.array {
|
||||
if element == x {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
fn test_fixed_array_of_interfaces_equality() {
|
||||
foo := Foo{}
|
||||
mut ary := Array{}
|
||||
ary.array[0] = foo
|
||||
ret := ary.contains(foo)
|
||||
println(ret)
|
||||
assert ret
|
||||
}
|
Loading…
Reference in New Issue
Block a user