From 66bc5417cd95a5597f3242979dfb702e2f5f90b8 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Thu, 26 Feb 2026 10:19:17 +0300 Subject: [PATCH] parser: fix function body `{` error message is not correct (fixes #16133) --- vlib/v/parser/fn.v | 7 ++++++- .../parser/tests/fn_decl_invalid_body_opener_lsbr_err.out | 3 +++ .../v/parser/tests/fn_decl_invalid_body_opener_lsbr_err.vv | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 vlib/v/parser/tests/fn_decl_invalid_body_opener_lsbr_err.out create mode 100644 vlib/v/parser/tests/fn_decl_invalid_body_opener_lsbr_err.vv diff --git a/vlib/v/parser/fn.v b/vlib/v/parser/fn.v index 55bc44a0d..5553b3f45 100644 --- a/vlib/v/parser/fn.v +++ b/vlib/v/parser/fn.v @@ -760,7 +760,12 @@ fn (mut p Parser) fn_decl() ast.FnDecl { mut return_type := ast.void_type // don't confuse token on the next line: fn decl, [attribute] same_line := p.tok.line_nr == p.prev_tok.line_nr - if (p.tok.kind.is_start_of_type() && (same_line || p.tok.kind != .lsbr)) + // `fn foo()[` is usually a mistaken body opener; report it as such + // instead of trying to parse `[` as a fixed array return type. + invalid_body_opener := same_line && p.tok.kind == .lsbr && p.peek_tok.line_nr > p.tok.line_nr + if invalid_body_opener { + p.unexpected(got: '${p.tok} after function signature', expecting: '`{`') + } else if (p.tok.kind.is_start_of_type() && (same_line || p.tok.kind != .lsbr)) || (same_line && p.tok.kind == .key_fn) { // Disallow [T] as return type if p.tok.kind == .lsbr && p.peek_tok.kind == .name && p.peek_tok.lit.len == 1 diff --git a/vlib/v/parser/tests/fn_decl_invalid_body_opener_lsbr_err.out b/vlib/v/parser/tests/fn_decl_invalid_body_opener_lsbr_err.out new file mode 100644 index 000000000..c037213e9 --- /dev/null +++ b/vlib/v/parser/tests/fn_decl_invalid_body_opener_lsbr_err.out @@ -0,0 +1,3 @@ +vlib/v/parser/tests/fn_decl_invalid_body_opener_lsbr_err.vv:1:9: error: unexpected token `[` after function signature, expecting `{` + 1 | fn foo()[ + | ^ diff --git a/vlib/v/parser/tests/fn_decl_invalid_body_opener_lsbr_err.vv b/vlib/v/parser/tests/fn_decl_invalid_body_opener_lsbr_err.vv new file mode 100644 index 000000000..2c86f3d3f --- /dev/null +++ b/vlib/v/parser/tests/fn_decl_invalid_body_opener_lsbr_err.vv @@ -0,0 +1,3 @@ +fn foo()[ + println('') +] -- 2.39.5