diff --git a/vlib/v/gen/c/auto_eq_methods.v b/vlib/v/gen/c/auto_eq_methods.v index 021c1c87523e83..baea86d49a13eb 100644 --- a/vlib/v/gen/c/auto_eq_methods.v +++ b/vlib/v/gen/c/auto_eq_methods.v @@ -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 } diff --git a/vlib/v/tests/option_operator_overload_test.v b/vlib/v/tests/option_operator_overload_test.v new file mode 100644 index 00000000000000..0d2de95705f0ac --- /dev/null +++ b/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 +}