Skip to content

Commit

Permalink
cgen: fix auto_eq for option eq operator overload (#20795)
Browse files Browse the repository at this point in the history
  • Loading branch information
felipensp committed Feb 13, 2024
1 parent ce99c31 commit 694c781
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 1 deletion.
8 changes: 7 additions & 1 deletion vlib/v/gen/c/auto_eq_methods.v
Expand Up @@ -188,7 +188,13 @@ fn (mut g Gen) gen_struct_equality_fn(left_type ast.Type) string {

// overloaded
if left.sym.has_method('==') {
fn_builder.writeln('\treturn ${fn_name}__eq(a, b);')
if left.typ.has_flag(.option) {
opt_ptr_styp := g.typ(left.typ.set_nr_muls(0).clear_flag(.option))
opt_fn_name := opt_ptr_styp.replace('struct ', '')
fn_builder.writeln('\treturn (a.state == b.state && b.state == 2) || ${opt_fn_name}__eq(*(${opt_ptr_styp}*)a.data, *(${opt_ptr_styp}*)b.data);')
} else {
fn_builder.writeln('\treturn ${fn_name}__eq(a, b);')
}
fn_builder.writeln('}')
return fn_name
}
Expand Down
38 changes: 38 additions & 0 deletions vlib/v/tests/option_operator_overload_test.v
@@ -0,0 +1,38 @@
import time

struct SubTestTimeOptional[T] {
iis string
ext T
}

pub fn (s1 SubTestTimeOptional[T]) == (s2 SubTestTimeOptional[T]) bool {
return s1.iis == s2.iis
}

struct TestTimeOptional {
exp ?time.Time
}

fn now_optional[T]() SubTestTimeOptional[T] {
return SubTestTimeOptional[TestTimeOptional]{
iis: 'Vtest'
ext: TestTimeOptional{
exp: time.now()
}
}
}

fn now_delay_optional[T]() SubTestTimeOptional[T] {
return SubTestTimeOptional[T]{
iis: 'Vtest'
ext: TestTimeOptional{
exp: time.now().add_seconds(5)
}
}
}

fn test_main() {
mut t1 := now_optional[TestTimeOptional]()
mut t2 := now_delay_optional[TestTimeOptional]()
assert t1 != t2
}

0 comments on commit 694c781

Please sign in to comment.