From 98fd99944b8d6e4e457cba7e0ff984b5ee217685 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 25 Mar 2026 16:42:23 +0300 Subject: [PATCH] checker: fix broken operator overloading for aliased arrays (fixes #23213) --- vlib/v/checker/infix.v | 6 ++++-- ...ixed_array_operator_overloading_cmp_test.v | 20 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 vlib/v/tests/aliases/alias_fixed_array_operator_overloading_cmp_test.v diff --git a/vlib/v/checker/infix.v b/vlib/v/checker/infix.v index a3d1b7dd6..6cdd158d4 100644 --- a/vlib/v/checker/infix.v +++ b/vlib/v/checker/infix.v @@ -593,14 +593,16 @@ fn (mut c Checker) infix_expr(mut node ast.InfixExpr) ast.Type { } } .gt, .lt, .ge, .le { + cmp_method_name := '<' unwrapped_left_type := c.unwrap_generic(left_type) left_sym = c.table.sym(unwrapped_left_type) - if left_sym.kind == .alias && !left_sym.has_method_with_generic_parent(node.op.str()) { + if left_sym.kind == .alias && !left_sym.has_method_with_generic_parent(cmp_method_name) { left_sym = c.table.final_sym(unwrapped_left_type) } unwrapped_right_type := c.unwrap_generic(right_type) right_sym = c.table.sym(unwrapped_right_type) - if right_sym.kind == .alias && !right_sym.has_method_with_generic_parent(node.op.str()) { + if right_sym.kind == .alias + && !right_sym.has_method_with_generic_parent(cmp_method_name) { right_sym = c.table.final_sym(unwrapped_right_type) } if left_sym.kind in [.array, .array_fixed] && right_sym.kind in [.array, .array_fixed] { diff --git a/vlib/v/tests/aliases/alias_fixed_array_operator_overloading_cmp_test.v b/vlib/v/tests/aliases/alias_fixed_array_operator_overloading_cmp_test.v new file mode 100644 index 000000000..01dd061e7 --- /dev/null +++ b/vlib/v/tests/aliases/alias_fixed_array_operator_overloading_cmp_test.v @@ -0,0 +1,20 @@ +type Addr = [4]u8 + +fn (a Addr) u32() u32 { + return (u32(a[0]) << 24) | (u32(a[1]) << 16) | (u32(a[2]) << 8) | u32(a[3]) +} + +fn (a Addr) < (b Addr) bool { + return a.u32() < b.u32() +} + +fn test_fixed_array_alias_derived_comparison_operators_work() { + a := Addr([u8(1), 2, 3, 4]!) + b := Addr([u8(5), 4, 3, 2]!) + + assert a < b + assert a <= b + assert b > a + assert b >= a + assert a != b +} -- 2.39.5