checker: improve errors for `return` count mismatch (#8686)
parent
9d5243a410
commit
375efb0953
|
@ -1301,7 +1301,7 @@ pub fn (mut c Checker) call_expr(mut call_expr ast.CallExpr) table.Type {
|
||||||
|
|
||||||
fn (mut c Checker) check_map_and_filter(is_map bool, elem_typ table.Type, call_expr ast.CallExpr) {
|
fn (mut c Checker) check_map_and_filter(is_map bool, elem_typ table.Type, call_expr ast.CallExpr) {
|
||||||
if call_expr.args.len != 1 {
|
if call_expr.args.len != 1 {
|
||||||
c.error('expected 1 arguments, but got $call_expr.args.len', call_expr.pos)
|
c.error('expected 1 argument, but got $call_expr.args.len', call_expr.pos)
|
||||||
// Finish early so that it doesn't fail later
|
// Finish early so that it doesn't fail later
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -2359,12 +2359,13 @@ pub fn (mut c Checker) return_stmt(mut return_stmt ast.Return) {
|
||||||
expected_type := c.unwrap_generic(c.expected_type)
|
expected_type := c.unwrap_generic(c.expected_type)
|
||||||
expected_type_sym := c.table.get_type_symbol(expected_type)
|
expected_type_sym := c.table.get_type_symbol(expected_type)
|
||||||
if return_stmt.exprs.len > 0 && c.cur_fn.return_type == table.void_type {
|
if return_stmt.exprs.len > 0 && c.cur_fn.return_type == table.void_type {
|
||||||
c.error('too many arguments to return, current function does not return anything',
|
c.error('unexpected argument, current function does not return anything', return_stmt.exprs[0].position())
|
||||||
return_stmt.pos)
|
|
||||||
return
|
return
|
||||||
} else if return_stmt.exprs.len == 0 && !(c.expected_type == table.void_type
|
} else if return_stmt.exprs.len == 0 && !(c.expected_type == table.void_type
|
||||||
|| expected_type_sym.kind == .void) {
|
|| expected_type_sym.kind == .void) {
|
||||||
c.error('too few arguments to return', return_stmt.pos)
|
stype := c.table.type_to_str(expected_type)
|
||||||
|
arg := if expected_type_sym.kind == .multi_return { 'arguments' } else { 'argument' }
|
||||||
|
c.error('expected `$stype` $arg', return_stmt.pos)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if return_stmt.exprs.len == 0 {
|
if return_stmt.exprs.len == 0 {
|
||||||
|
@ -2397,7 +2398,8 @@ pub fn (mut c Checker) return_stmt(mut return_stmt ast.Return) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if expected_types.len > 0 && expected_types.len != got_types.len {
|
if expected_types.len > 0 && expected_types.len != got_types.len {
|
||||||
c.error('wrong number of return arguments', return_stmt.pos)
|
arg := if expected_types.len == 1 { 'argument' } else { 'arguments' }
|
||||||
|
c.error('expected $expected_types.len $arg, but got $got_types.len', return_stmt.pos)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for i, exp_type in expected_types {
|
for i, exp_type in expected_types {
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
vlib/v/checker/tests/array_map_arg_mismatch.vv:3:4: error: expected 1 arguments, but got 0
|
vlib/v/checker/tests/array_map_arg_mismatch.vv:3:4: error: expected 1 argument, but got 0
|
||||||
1 | fn main() {
|
1 | fn main() {
|
||||||
2 | a := [1, 2, 3]
|
2 | a := [1, 2, 3]
|
||||||
3 | a.map()
|
3 | a.map()
|
||||||
| ~~~~~
|
| ~~~~~
|
||||||
4 | a.map(it * 2, 3)
|
4 | a.map(it * 2, 3)
|
||||||
5 | }
|
5 | }
|
||||||
vlib/v/checker/tests/array_map_arg_mismatch.vv:4:4: error: expected 1 arguments, but got 2
|
vlib/v/checker/tests/array_map_arg_mismatch.vv:4:4: error: expected 1 argument, but got 2
|
||||||
2 | a := [1, 2, 3]
|
2 | a := [1, 2, 3]
|
||||||
3 | a.map()
|
3 | a.map()
|
||||||
4 | a.map(it * 2, 3)
|
4 | a.map(it * 2, 3)
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
vlib/v/checker/tests/return_count_mismatch.vv:2:9: error: unexpected argument, current function does not return anything
|
||||||
|
1 | fn v() {
|
||||||
|
2 | return 3
|
||||||
|
| ^
|
||||||
|
3 | }
|
||||||
|
4 |
|
||||||
|
vlib/v/checker/tests/return_count_mismatch.vv:7:2: error: expected `int` argument
|
||||||
|
5 | fn f() int
|
||||||
|
6 | {
|
||||||
|
7 | return
|
||||||
|
| ~~~~~~
|
||||||
|
8 | }
|
||||||
|
9 |
|
||||||
|
vlib/v/checker/tests/return_count_mismatch.vv:12:2: error: expected `(int, string)` arguments
|
||||||
|
10 | fn g() (int, string)
|
||||||
|
11 | {
|
||||||
|
12 | return
|
||||||
|
| ~~~~~~
|
||||||
|
13 | }
|
||||||
|
14 |
|
||||||
|
vlib/v/checker/tests/return_count_mismatch.vv:17:2: error: expected 1 argument, but got 2
|
||||||
|
15 | fn ff() int
|
||||||
|
16 | {
|
||||||
|
17 | return 2, ''
|
||||||
|
| ~~~~~~~~~~~~
|
||||||
|
18 | }
|
||||||
|
19 |
|
||||||
|
vlib/v/checker/tests/return_count_mismatch.vv:22:2: error: expected 2 arguments, but got 1
|
||||||
|
20 | fn gg() (int, string)
|
||||||
|
21 | {
|
||||||
|
22 | return 3
|
||||||
|
| ~~~~~~~~
|
||||||
|
23 | }
|
||||||
|
24 |
|
|
@ -0,0 +1,24 @@
|
||||||
|
fn v() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
fn f() int
|
||||||
|
{
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fn g() (int, string)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fn ff() int
|
||||||
|
{
|
||||||
|
return 2, ''
|
||||||
|
}
|
||||||
|
|
||||||
|
fn gg() (int, string)
|
||||||
|
{
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue