checker: check array insert/prepend arguments (#11295)

pull/11300/head
yuyi 2021-08-25 01:28:05 +08:00 committed by GitHub
parent 0bf9197f41
commit 96398efd2b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 67 additions and 0 deletions

View File

@ -2129,6 +2129,26 @@ pub fn (mut c Checker) method_call(mut node ast.CallExpr) ast.Type {
} else if left_type_sym.kind == .map && method_name in ['clone', 'keys', 'move', 'delete'] {
return c.map_builtin_method_call(mut node, left_type, left_type_sym)
} else if left_type_sym.kind == .array && method_name in ['insert', 'prepend'] {
if method_name == 'insert' {
if node.args.len != 2 {
c.error('`array.insert()` should have 2 arguments, e.g. `insert(1, val)`',
node.pos)
return ast.void_type
} else {
arg_type := c.expr(node.args[0].expr)
if arg_type !in [ast.int_type, ast.int_literal_type] {
c.error('the first argument of `array.insert()` should be integer',
node.args[0].expr.position())
return ast.void_type
}
}
} else {
if node.args.len != 1 {
c.error('`array.prepend()` should have 1 argument, e.g. `prepend(val)`',
node.pos)
return ast.void_type
}
}
info := left_type_sym.info as ast.Array
arg_expr := if method_name == 'insert' { node.args[1].expr } else { node.args[0].expr }
arg_type := c.expr(arg_expr)

View File

@ -0,0 +1,34 @@
vlib/v/checker/tests/array_insert_prepend_args_err.vv:8:13: error: `array.insert()` should have 2 arguments, e.g. `insert(1, val)`
6 | fn main() {
7 | tree := Node{}
8 | tree.child.insert(Node{})
| ~~~~~~~~~~~~~~
9 | tree.child.insert(2.1, Node{})
10 | tree.child.insert('abc', Node{})
vlib/v/checker/tests/array_insert_prepend_args_err.vv:9:20: error: the first argument of `array.insert()` should be integer
7 | tree := Node{}
8 | tree.child.insert(Node{})
9 | tree.child.insert(2.1, Node{})
| ~~~
10 | tree.child.insert('abc', Node{})
11 | tree.child.insert(Node{}, 2)
vlib/v/checker/tests/array_insert_prepend_args_err.vv:10:20: error: the first argument of `array.insert()` should be integer
8 | tree.child.insert(Node{})
9 | tree.child.insert(2.1, Node{})
10 | tree.child.insert('abc', Node{})
| ~~~~~
11 | tree.child.insert(Node{}, 2)
12 | tree.child.prepend()
vlib/v/checker/tests/array_insert_prepend_args_err.vv:11:20: error: the first argument of `array.insert()` should be integer
9 | tree.child.insert(2.1, Node{})
10 | tree.child.insert('abc', Node{})
11 | tree.child.insert(Node{}, 2)
| ~~~~~~
12 | tree.child.prepend()
13 | }
vlib/v/checker/tests/array_insert_prepend_args_err.vv:12:13: error: `array.prepend()` should have 1 argument, e.g. `prepend(val)`
10 | tree.child.insert('abc', Node{})
11 | tree.child.insert(Node{}, 2)
12 | tree.child.prepend()
| ~~~~~~~~~
13 | }

View File

@ -0,0 +1,13 @@
struct Node {
mut:
child []Node
}
fn main() {
tree := Node{}
tree.child.insert(Node{})
tree.child.insert(2.1, Node{})
tree.child.insert('abc', Node{})
tree.child.insert(Node{}, 2)
tree.child.prepend()
}