mirror of
https://github.com/vlang/v.git
synced 2025-09-14 09:56:16 -04:00
cgen: fix auto_eq for option eq operator overload (#20795)
This commit is contained in:
parent
ce99c31058
commit
694c781f57
@ -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
|
||||
}
|
||||
|
38
vlib/v/tests/option_operator_overload_test.v
Normal file
38
vlib/v/tests/option_operator_overload_test.v
Normal file
@ -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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user