parser: check using 'mut' on fn_decl return type (#13610)
parent
0fb1eaef04
commit
bc16c61f6f
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -0,0 +1,9 @@
|
|||
struct Foo{}
|
||||
|
||||
fn maker() ?mut Foo {
|
||||
inner := &Foo{}
|
||||
return *inner
|
||||
}
|
||||
|
||||
fn main() {
|
||||
}
|
|
@ -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
|
|
@ -0,0 +1,9 @@
|
|||
struct Foo{}
|
||||
|
||||
fn maker() (mut Foo) {
|
||||
inner := &Foo{}
|
||||
return *inner
|
||||
}
|
||||
|
||||
fn main() {
|
||||
}
|
Loading…
Reference in New Issue