parser: add errors for invalid anonymous function (#7786)
parent
9f74be4cf6
commit
c0e56d10c3
|
@ -443,12 +443,24 @@ fn (mut p Parser) anon_fn() ast.AnonFn {
|
||||||
is_arg: true
|
is_arg: true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
mut same_line := p.tok.line_nr == p.prev_tok.line_nr
|
||||||
mut return_type := table.void_type
|
mut return_type := table.void_type
|
||||||
|
// lpar: multiple return types
|
||||||
|
if same_line {
|
||||||
if p.tok.kind.is_start_of_type() {
|
if p.tok.kind.is_start_of_type() {
|
||||||
return_type = p.parse_type()
|
return_type = p.parse_type()
|
||||||
|
} else if p.tok.kind != .lcbr {
|
||||||
|
p.error_with_pos('expected return type, not $p.tok for anonymous function',
|
||||||
|
p.tok.position())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
mut stmts := []ast.Stmt{}
|
mut stmts := []ast.Stmt{}
|
||||||
no_body := p.tok.kind != .lcbr
|
no_body := p.tok.kind != .lcbr
|
||||||
|
same_line = p.tok.line_nr == p.prev_tok.line_nr
|
||||||
|
if no_body && same_line {
|
||||||
|
p.error_with_pos('unexpected `$p.tok.kind` after anonymous function signature, expecting `{`',
|
||||||
|
p.tok.position())
|
||||||
|
}
|
||||||
if p.tok.kind == .lcbr {
|
if p.tok.kind == .lcbr {
|
||||||
stmts = p.parse_block_no_scope(false)
|
stmts = p.parse_block_no_scope(false)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
vlib/v/parser/tests/anon_fn_return_type.vv:7:22: error: expected return type, not string "hi" for anonymous function
|
||||||
|
5 | _ = fn (name string) flag.Flag
|
||||||
|
6 | _ = fn (name string) flag.Flag {return {}}
|
||||||
|
7 | _ = fn (name string) "hi" + name
|
||||||
|
| ~~~~
|
||||||
|
8 |
|
|
@ -0,0 +1,8 @@
|
||||||
|
import flag
|
||||||
|
|
||||||
|
_ = fn (name string)
|
||||||
|
_ = fn (name string) {}
|
||||||
|
_ = fn (name string) flag.Flag
|
||||||
|
_ = fn (name string) flag.Flag {return {}}
|
||||||
|
_ = fn (name string) "hi" + name
|
||||||
|
|
|
@ -437,7 +437,8 @@ pub fn (kind Kind) is_infix() bool {
|
||||||
pub fn (tok &Token) can_start_type(builtin_type_names []string) bool {
|
pub fn (tok &Token) can_start_type(builtin_type_names []string) bool {
|
||||||
match tok.kind {
|
match tok.kind {
|
||||||
.name { return tok.lit[0].is_capital() || tok.lit in builtin_type_names }
|
.name { return tok.lit[0].is_capital() || tok.lit in builtin_type_names }
|
||||||
.amp, .lsbr, .question { return true }
|
// Note: return type (T1, T2) should be handled elsewhere
|
||||||
|
.amp, .key_fn, .lsbr, .question { return true }
|
||||||
else {}
|
else {}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
|
|
Loading…
Reference in New Issue