From 6f9f2bc0d7272405ca8fb367ed9c073578e7cea2 Mon Sep 17 00:00:00 2001 From: Swastik Baranwal Date: Sat, 7 Feb 2026 22:54:48 +0530 Subject: [PATCH] parser: disallow `[T]` as fn return type (#26530) --- vlib/v/parser/fn.v | 7 +++++++ vlib/v/parser/tests/generic_return_invalid_err.out | 7 +++++++ vlib/v/parser/tests/generic_return_invalid_err.vv | 9 +++++++++ 3 files changed, 23 insertions(+) create mode 100644 vlib/v/parser/tests/generic_return_invalid_err.out create mode 100644 vlib/v/parser/tests/generic_return_invalid_err.vv diff --git a/vlib/v/parser/fn.v b/vlib/v/parser/fn.v index 93f0db399..2c7d98811 100644 --- a/vlib/v/parser/fn.v +++ b/vlib/v/parser/fn.v @@ -762,6 +762,13 @@ fn (mut p Parser) fn_decl() ast.FnDecl { 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)) || (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 + && p.peek_tok.lit[0].is_capital() { + return_type_pos = return_type_pos.extend(p.peek_tok.pos()).extend(p.peek_token(2).pos()) + p.error_with_pos('invalid generic return, use `${p.peek_tok.lit}` instead', + return_type_pos) + } p.inside_fn_return = true return_type = p.parse_type() p.inside_fn_return = false diff --git a/vlib/v/parser/tests/generic_return_invalid_err.out b/vlib/v/parser/tests/generic_return_invalid_err.out new file mode 100644 index 000000000..6e8de3587 --- /dev/null +++ b/vlib/v/parser/tests/generic_return_invalid_err.out @@ -0,0 +1,7 @@ +vlib/v/parser/tests/generic_return_invalid_err.vv:3:16: error: invalid generic return, use `T` instead + 1 | module main + 2 | + 3 | fn foo[T](v T) [T] { + | ~~~ + 4 | return v + 5 | } diff --git a/vlib/v/parser/tests/generic_return_invalid_err.vv b/vlib/v/parser/tests/generic_return_invalid_err.vv new file mode 100644 index 000000000..e9032646b --- /dev/null +++ b/vlib/v/parser/tests/generic_return_invalid_err.vv @@ -0,0 +1,9 @@ +module main + +fn foo[T](v T) [T] { + return v +} + +fn main() { + println(foo[string]('Hello World')) +} -- 2.39.5