parser: correct fn arg position in error message
parent
845084c89d
commit
d0ff9a7c4a
|
@ -0,0 +1,5 @@
|
||||||
|
vlib/v/checker/tests/function_arg_redefinition.v:1:17: error: redefinition of parameter `para1`
|
||||||
|
1 | fn f(para1 int, para1 f32) int {
|
||||||
|
| ~~~~~
|
||||||
|
2 | return para1
|
||||||
|
3 | }
|
|
@ -0,0 +1,7 @@
|
||||||
|
fn f(para1 int, para1 f32) int {
|
||||||
|
return para1
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
a := f(11, 1.1)
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
vlib/v/checker/tests/function_variadic_arg_non_final.v:1:6: error: cannot use ...(variadic) with non-final parameter para1
|
||||||
|
1 | fn f(para1 ...int, para2 f32) int {
|
||||||
|
| ~~~~~
|
||||||
|
2 | return 22
|
||||||
|
3 | }
|
|
@ -0,0 +1,7 @@
|
||||||
|
fn f(para1 ...int, para2 f32) int {
|
||||||
|
return 22
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
a := f(11, 1.1)
|
||||||
|
}
|
|
@ -204,7 +204,7 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
||||||
args << args2
|
args << args2
|
||||||
for i, arg in args {
|
for i, arg in args {
|
||||||
if p.scope.known_var(arg.name) {
|
if p.scope.known_var(arg.name) {
|
||||||
p.error('redefinition of parameter `$arg.name`')
|
p.error_with_pos('redefinition of parameter `$arg.name`', arg.pos)
|
||||||
}
|
}
|
||||||
p.scope.register(arg.name, ast.Var{
|
p.scope.register(arg.name, ast.Var{
|
||||||
name: arg.name
|
name: arg.name
|
||||||
|
@ -223,8 +223,8 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
||||||
sym := p.table.get_type_symbol(arg.typ)
|
sym := p.table.get_type_symbol(arg.typ)
|
||||||
if sym.kind !in [.array, .struct_, .map, .placeholder] && arg.typ != table.t_type &&
|
if sym.kind !in [.array, .struct_, .map, .placeholder] && arg.typ != table.t_type &&
|
||||||
!arg.typ.is_ptr() {
|
!arg.typ.is_ptr() {
|
||||||
p.error('mutable arguments are only allowed for arrays, maps, and structs\n' +
|
p.error_with_pos('mutable arguments are only allowed for arrays, maps, and structs\n' +
|
||||||
'return values instead: `fn foo(n mut int) {` => `fn foo(n int) int {`')
|
'return values instead: `fn foo(n mut int) {` => `fn foo(n int) int {`', arg.pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -382,6 +382,7 @@ fn (mut p Parser) fn_args() ([]table.Arg, bool) {
|
||||||
p.next()
|
p.next()
|
||||||
is_variadic = true
|
is_variadic = true
|
||||||
}
|
}
|
||||||
|
pos := p.tok.position()
|
||||||
mut arg_type := p.parse_type()
|
mut arg_type := p.parse_type()
|
||||||
if is_mut && arg_type != table.t_type {
|
if is_mut && arg_type != table.t_type {
|
||||||
// if arg_type.is_ptr() {
|
// if arg_type.is_ptr() {
|
||||||
|
@ -395,11 +396,12 @@ fn (mut p Parser) fn_args() ([]table.Arg, bool) {
|
||||||
}
|
}
|
||||||
if p.tok.kind == .comma {
|
if p.tok.kind == .comma {
|
||||||
if is_variadic {
|
if is_variadic {
|
||||||
p.error('cannot use ...(variadic) with non-final parameter no $arg_no')
|
p.error_with_pos('cannot use ...(variadic) with non-final parameter no $arg_no', pos)
|
||||||
}
|
}
|
||||||
p.next()
|
p.next()
|
||||||
}
|
}
|
||||||
args << table.Arg{
|
args << table.Arg{
|
||||||
|
pos: pos
|
||||||
name: arg_name
|
name: arg_name
|
||||||
is_mut: is_mut
|
is_mut: is_mut
|
||||||
typ: arg_type
|
typ: arg_type
|
||||||
|
@ -412,10 +414,12 @@ fn (mut p Parser) fn_args() ([]table.Arg, bool) {
|
||||||
if is_mut {
|
if is_mut {
|
||||||
p.next()
|
p.next()
|
||||||
}
|
}
|
||||||
|
mut arg_pos := [p.tok.position()]
|
||||||
mut arg_names := [p.check_name()]
|
mut arg_names := [p.check_name()]
|
||||||
// `a, b, c int`
|
// `a, b, c int`
|
||||||
for p.tok.kind == .comma {
|
for p.tok.kind == .comma {
|
||||||
p.next()
|
p.next()
|
||||||
|
arg_pos << p.tok.position()
|
||||||
arg_names << p.check_name()
|
arg_names << p.check_name()
|
||||||
}
|
}
|
||||||
if p.tok.kind == .key_mut {
|
if p.tok.kind == .key_mut {
|
||||||
|
@ -437,15 +441,16 @@ fn (mut p Parser) fn_args() ([]table.Arg, bool) {
|
||||||
if is_variadic {
|
if is_variadic {
|
||||||
typ = typ.set_flag(.variadic)
|
typ = typ.set_flag(.variadic)
|
||||||
}
|
}
|
||||||
for arg_name in arg_names {
|
for i, arg_name in arg_names {
|
||||||
args << table.Arg{
|
args << table.Arg{
|
||||||
|
pos: arg_pos[i]
|
||||||
name: arg_name
|
name: arg_name
|
||||||
is_mut: is_mut
|
is_mut: is_mut
|
||||||
typ: typ
|
typ: typ
|
||||||
}
|
}
|
||||||
// if typ.typ.kind == .variadic && p.tok.kind == .comma {
|
// if typ.typ.kind == .variadic && p.tok.kind == .comma {
|
||||||
if is_variadic && p.tok.kind == .comma {
|
if is_variadic && p.tok.kind == .comma {
|
||||||
p.error('cannot use ...(variadic) with non-final parameter $arg_name')
|
p.error_with_pos('cannot use ...(variadic) with non-final parameter $arg_name', arg_pos[i])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p.tok.kind != .rpar {
|
if p.tok.kind != .rpar {
|
||||||
|
|
|
@ -5,6 +5,7 @@ module table
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import v.cflag
|
import v.cflag
|
||||||
|
import v.token
|
||||||
|
|
||||||
pub struct Table {
|
pub struct Table {
|
||||||
pub mut:
|
pub mut:
|
||||||
|
@ -34,6 +35,7 @@ pub mut:
|
||||||
|
|
||||||
pub struct Arg {
|
pub struct Arg {
|
||||||
pub:
|
pub:
|
||||||
|
pos token.Position
|
||||||
name string
|
name string
|
||||||
is_mut bool
|
is_mut bool
|
||||||
typ Type
|
typ Type
|
||||||
|
|
Loading…
Reference in New Issue