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