parser: check using 'mut' on fn_decl return type (#13610)

pull/13614/head
yuyi 2022-02-27 20:23:43 +08:00 committed by GitHub
parent 0fb1eaef04
commit bc16c61f6f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 38 additions and 0 deletions

View File

@ -353,7 +353,9 @@ 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) {
p.inside_fn_return = true
return_type = p.parse_type()
p.inside_fn_return = false
return_type_pos = return_type_pos.extend(p.prev_tok.pos())
}
mut type_sym_method_idx := 0

View File

@ -376,6 +376,9 @@ pub fn (mut p Parser) parse_type() ast.Type {
p.register_auto_import('sync')
}
mut nr_muls := 0
if p.inside_fn_return && p.tok.kind == .key_mut {
p.error_with_pos('cannot use `mut` on fn return type', p.tok.pos())
}
if p.tok.kind == .key_mut || is_shared || is_atomic {
nr_muls++
p.next()

View File

@ -40,6 +40,7 @@ mut:
inside_or_expr bool
inside_for bool
inside_fn bool // true even with implicit main
inside_fn_return bool
inside_unsafe_fn bool
inside_str_interp bool
inside_array_lit bool

View File

@ -0,0 +1,7 @@
vlib/v/parser/tests/fn_decl_return_type_err_a.vv:3:13: error: cannot use `mut` on fn return type
1 | struct Foo{}
2 |
3 | fn maker() ?mut Foo {
| ~~~
4 | inner := &Foo{}
5 | return *inner

View File

@ -0,0 +1,9 @@
struct Foo{}
fn maker() ?mut Foo {
inner := &Foo{}
return *inner
}
fn main() {
}

View File

@ -0,0 +1,7 @@
vlib/v/parser/tests/fn_decl_return_type_err_b.vv:3:13: error: cannot use `mut` on fn return type
1 | struct Foo{}
2 |
3 | fn maker() (mut Foo) {
| ~~~
4 | inner := &Foo{}
5 | return *inner

View File

@ -0,0 +1,9 @@
struct Foo{}
fn maker() (mut Foo) {
inner := &Foo{}
return *inner
}
fn main() {
}