From 877298befb83b15f057dd0229970803209e78777 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 11 Mar 2026 12:55:13 +0300 Subject: [PATCH] checker: specific array initialisation fails (fixes #14261) --- .../tests/run/array_init_inline_literal_it.run.out | 7 +++++++ .../checker/tests/run/array_init_inline_literal_it.vv | 4 ++++ vlib/v/gen/c/array.v | 2 ++ vlib/v/parser/checks.v | 11 +++++++++-- vlib/v/tests/builtin_arrays/array_with_it_test.v | 5 +++++ 5 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 vlib/v/checker/tests/run/array_init_inline_literal_it.run.out create mode 100644 vlib/v/checker/tests/run/array_init_inline_literal_it.vv diff --git a/vlib/v/checker/tests/run/array_init_inline_literal_it.run.out b/vlib/v/checker/tests/run/array_init_inline_literal_it.run.out new file mode 100644 index 000000000..0a96633aa --- /dev/null +++ b/vlib/v/checker/tests/run/array_init_inline_literal_it.run.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/run/array_init_inline_literal_it.vv:2:45: warning: variable `it` in array initialization will soon be replaced with `index` + 1 | fn main() { + 2 | arr := []int{len: 2, init: [4][it] or { 0 }} + | ^ + 3 | println(arr) + 4 | } +[4, 0] diff --git a/vlib/v/checker/tests/run/array_init_inline_literal_it.vv b/vlib/v/checker/tests/run/array_init_inline_literal_it.vv new file mode 100644 index 000000000..bc00af189 --- /dev/null +++ b/vlib/v/checker/tests/run/array_init_inline_literal_it.vv @@ -0,0 +1,4 @@ +fn main() { + arr := []int{len: 2, init: [4][it] or { 0 }} + println(arr) +} diff --git a/vlib/v/gen/c/array.v b/vlib/v/gen/c/array.v index d6c7e63d5..8b46a6ac6 100644 --- a/vlib/v/gen/c/array.v +++ b/vlib/v/gen/c/array.v @@ -192,6 +192,7 @@ fn (mut g Gen) fixed_array_init(node ast.ArrayInit, array_type Type, var_name st g.set_current_pos_as_last_stmt_pos() g.indent++ g.writeln('${ast.int_type_name} it = index;') // FIXME: Remove this line when it is fully forbidden + g.set_current_pos_as_last_stmt_pos() g.write('*pelem = ') g.expr_with_init(node) g.writeln(';') @@ -449,6 +450,7 @@ fn (mut g Gen) array_init_with_fields(node ast.ArrayInit, elem_type Type, is_amp g.set_current_pos_as_last_stmt_pos() g.indent++ g.writeln('${ast.int_type_name} it = index;') // FIXME: Remove this line when it is fully forbidden + g.set_current_pos_as_last_stmt_pos() if elem_type.unaliased_sym.kind != .array_fixed { g.write('*pelem = ') g.expr_with_init(node) diff --git a/vlib/v/parser/checks.v b/vlib/v/parser/checks.v index 1598aa791..9480df2b3 100644 --- a/vlib/v/parser/checks.v +++ b/vlib/v/parser/checks.v @@ -64,16 +64,23 @@ fn (p &Parser) is_array_type() bool { mut i := 1 mut tok := p.tok line_nr := p.tok.line_nr + mut sbr_level := if p.tok.kind == .lsbr { 1 } else { 0 } for { tok = p.peek_token(i) if tok.line_nr != line_nr { return false } - if tok.kind in [.name, .amp] { + if sbr_level == 0 + && tok.kind in [.name, .amp, .lpar, .question, .key_atomic, .key_fn, .key_shared, .key_struct] { return true } - if tok.kind in [.eof, .colon, .dot] { + if tok.kind == .lsbr { + sbr_level++ + } else if tok.kind == .rsbr { + sbr_level-- + } + if sbr_level == 0 && tok.kind in [.eof, .colon, .dot] { break } i++ diff --git a/vlib/v/tests/builtin_arrays/array_with_it_test.v b/vlib/v/tests/builtin_arrays/array_with_it_test.v index 214968f97..c26ed63c0 100644 --- a/vlib/v/tests/builtin_arrays/array_with_it_test.v +++ b/vlib/v/tests/builtin_arrays/array_with_it_test.v @@ -24,3 +24,8 @@ fn test_array_init_with_option() { assert arr[1] == 1.1 assert arr[2] == 0.0 } + +fn test_array_init_with_inline_array_literal_and_option() { + arr := []int{len: 2, init: [4][index] or { 0 }} + assert arr == [4, 0] +} -- 2.39.5