Skip to content

Commit 6f9f2bc

Browse files
authored
parser: disallow [T] as fn return type (#26530)
1 parent bdee72b commit 6f9f2bc

3 files changed

Lines changed: 23 additions & 0 deletions

File tree

‎vlib/v/parser/fn.v‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,13 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
762762
same_line := p.tok.line_nr == p.prev_tok.line_nr
763763
if (p.tok.kind.is_start_of_type() && (same_line || p.tok.kind != .lsbr))
764764
|| (same_line && p.tok.kind == .key_fn) {
765+
// Disallow [T] as return type
766+
if p.tok.kind == .lsbr && p.peek_tok.kind == .name && p.peek_tok.lit.len == 1
767+
&& p.peek_tok.lit[0].is_capital() {
768+
return_type_pos = return_type_pos.extend(p.peek_tok.pos()).extend(p.peek_token(2).pos())
769+
p.error_with_pos('invalid generic return, use `${p.peek_tok.lit}` instead',
770+
return_type_pos)
771+
}
765772
p.inside_fn_return = true
766773
return_type = p.parse_type()
767774
p.inside_fn_return = false
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
vlib/v/parser/tests/generic_return_invalid_err.vv:3:16: error: invalid generic return, use `T` instead
2+
1 | module main
3+
2 |
4+
3 | fn foo[T](v T) [T] {
5+
| ~~~
6+
4 | return v
7+
5 | }
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module main
2+
3+
fn foo[T](v T) [T] {
4+
return v
5+
}
6+
7+
fn main() {
8+
println(foo[string]('Hello World'))
9+
}

0 commit comments

Comments
 (0)