From ea844112b6df192b442c2ca2b35b410c85b9e312 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 15 Apr 2026 05:13:55 +0300 Subject: [PATCH] checker: fix empty interface array push with fixed array c error (fixes #23011) --- vlib/v/checker/containers.v | 4 ++++ vlib/v/checker/infix.v | 6 +++++- .../append_fixed_array_to_empty_interface_array_err.out | 6 ++++++ .../append_fixed_array_to_empty_interface_array_err.vv | 6 ++++++ 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 vlib/v/checker/tests/append_fixed_array_to_empty_interface_array_err.out create mode 100644 vlib/v/checker/tests/append_fixed_array_to_empty_interface_array_err.vv diff --git a/vlib/v/checker/containers.v b/vlib/v/checker/containers.v index 9655b8dc4..f87567f5a 100644 --- a/vlib/v/checker/containers.v +++ b/vlib/v/checker/containers.v @@ -948,6 +948,10 @@ fn (mut c Checker) check_append(mut node ast.InfixExpr, left_type ast.Type, righ } } if left_value_sym.kind == .interface { + if right is ast.ArrayInit && right.is_fixed { + c.error('cannot append `${right_sym.name}` to `${left_sym.name}`', right_pos) + return ast.void_type + } right_is_interface_value := c.table.does_type_implement_interface(c.unwrap_generic(right_type), left_value_type) if right_is_interface_value { diff --git a/vlib/v/checker/infix.v b/vlib/v/checker/infix.v index a0576e07f..c9e8804be 100644 --- a/vlib/v/checker/infix.v +++ b/vlib/v/checker/infix.v @@ -181,7 +181,11 @@ fn (mut c Checker) infix_expr(mut node ast.InfixExpr) ast.Type { } } } else if mut node.right is ast.ArrayInit { - if node.right.exprs.len == 0 && node.right.elem_type == ast.void_type { + left_value_type := c.table.value_type(c.unwrap_generic(left_type)) + if node.right.is_fixed + && c.table.final_sym(c.unwrap_generic(left_value_type)).kind == .interface { + c.expected_type = ast.void_type + } else if node.right.exprs.len == 0 && node.right.elem_type == ast.void_type { // handle arr << [] where [] is empty info := c.table.sym(left_type).array_info() node.right.elem_type = info.elem_type diff --git a/vlib/v/checker/tests/append_fixed_array_to_empty_interface_array_err.out b/vlib/v/checker/tests/append_fixed_array_to_empty_interface_array_err.out new file mode 100644 index 000000000..10b8ced2e --- /dev/null +++ b/vlib/v/checker/tests/append_fixed_array_to_empty_interface_array_err.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/append_fixed_array_to_empty_interface_array_err.vv:5:12: error: cannot append `[2]int` to `[]Any` + 3 | fn main() { + 4 | mut values := []Any{} + 5 | values << [7, 8]! + | ~~~~~~~ + 6 | } diff --git a/vlib/v/checker/tests/append_fixed_array_to_empty_interface_array_err.vv b/vlib/v/checker/tests/append_fixed_array_to_empty_interface_array_err.vv new file mode 100644 index 000000000..9a88594bf --- /dev/null +++ b/vlib/v/checker/tests/append_fixed_array_to_empty_interface_array_err.vv @@ -0,0 +1,6 @@ +interface Any {} + +fn main() { + mut values := []Any{} + values << [7, 8]! +} -- 2.39.5