checker: simplify argument qualifier errors (#6321)
parent
90128ed4ee
commit
49c322f120
|
@ -242,7 +242,7 @@ pub struct FnDecl {
|
|||
pub:
|
||||
name string
|
||||
mod string
|
||||
args []table.Arg
|
||||
args []table.Arg // parameters
|
||||
is_deprecated bool
|
||||
is_pub bool
|
||||
is_variadic bool
|
||||
|
|
|
@ -1331,31 +1331,16 @@ pub fn (mut c Checker) call_fn(mut call_expr ast.CallExpr) table.Type {
|
|||
if call_arg.is_mut {
|
||||
c.fail_if_immutable(call_arg.expr)
|
||||
if !arg.is_mut {
|
||||
mut words := 'mutable'
|
||||
mut tok := 'mut'
|
||||
if call_arg.share == .shared_t {
|
||||
words = 'shared'
|
||||
tok = 'shared'
|
||||
} else if call_arg.share == .atomic_t {
|
||||
words = 'atomic'
|
||||
tok = 'atomic'
|
||||
}
|
||||
c.error('`$arg.name` argument is not $words, `$tok` is not needed`', call_arg.expr.position())
|
||||
tok := call_arg.share.str()
|
||||
c.error('`$call_expr.name` parameter `$arg.name` is not `$tok`, `$tok` is not needed`',
|
||||
call_arg.expr.position())
|
||||
} else if arg.typ.share() != call_arg.share {
|
||||
c.error('wrong shared type', call_arg.expr.position())
|
||||
}
|
||||
} else {
|
||||
if arg.is_mut && (!call_arg.is_mut || arg.typ.share() != call_arg.share) {
|
||||
mut words := ' mutable'
|
||||
mut tok := 'mut'
|
||||
if arg.typ.share() == .shared_t {
|
||||
words = ' shared'
|
||||
tok = 'shared'
|
||||
} else if arg.typ.share() == .atomic_t {
|
||||
words = 'n atomic'
|
||||
tok = 'atomic'
|
||||
}
|
||||
c.error('`$arg.name` is a$words argument, you need to provide `$tok`: `${call_expr.name}($tok ...)`',
|
||||
tok := call_arg.share.str()
|
||||
c.error('`$call_expr.name` parameter `$arg.name` is `$tok`, you need to provide `$tok` e.g. `$tok arg${i+1}`',
|
||||
call_arg.expr.position())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
vlib/v/checker/tests/mut_arg.vv:6:3: error: `f` parameter `par` is `mut`, you need to provide `mut` e.g. `mut arg1`
|
||||
4 | }
|
||||
5 |
|
||||
6 | f([3,4])
|
||||
| ~~~~~
|
||||
7 | mut a := [1,2]
|
||||
8 | f(a)
|
||||
vlib/v/checker/tests/mut_arg.vv:8:3: error: `f` parameter `par` is `mut`, you need to provide `mut` e.g. `mut arg1`
|
||||
6 | f([3,4])
|
||||
7 | mut a := [1,2]
|
||||
8 | f(a)
|
||||
| ^
|
||||
9 |
|
||||
10 | g(mut [3,4])
|
||||
vlib/v/checker/tests/mut_arg.vv:10:7: error: `g` parameter `par` is not `mut`, `mut` is not needed`
|
||||
8 | f(a)
|
||||
9 |
|
||||
10 | g(mut [3,4])
|
||||
| ~~~~~
|
||||
11 | g(mut a)
|
||||
vlib/v/checker/tests/mut_arg.vv:11:7: error: `g` parameter `par` is not `mut`, `mut` is not needed`
|
||||
9 |
|
||||
10 | g(mut [3,4])
|
||||
11 | g(mut a)
|
||||
| ^
|
|
@ -0,0 +1,11 @@
|
|||
fn f(mut par []int) {
|
||||
}
|
||||
fn g(par []int) {
|
||||
}
|
||||
|
||||
f([3,4])
|
||||
mut a := [1,2]
|
||||
f(a)
|
||||
|
||||
g(mut [3,4])
|
||||
g(mut a)
|
|
@ -22,7 +22,7 @@ pub mut:
|
|||
|
||||
pub struct Fn {
|
||||
pub:
|
||||
args []Arg
|
||||
args []Arg // parameters
|
||||
return_type Type
|
||||
return_type_source_name string
|
||||
is_variadic bool
|
||||
|
@ -39,6 +39,7 @@ pub mut:
|
|||
name string
|
||||
}
|
||||
|
||||
// parameter
|
||||
pub struct Arg {
|
||||
pub:
|
||||
pos token.Position
|
||||
|
|
Loading…
Reference in New Issue