mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
parser: disallow the array init: attr, when the len: attr is not provided (#16735)
This commit is contained in:
parent
87f8069728
commit
3c5cfa22d1
@ -16,7 +16,7 @@ fn main() {
|
||||
// Breadth-First Search (BFS) allows you to find the shortest distance between two nodes in the graph.
|
||||
fn breadth_first_search_path(graph map[string][]string, vertex string, target string) []string {
|
||||
mut path := []string{}
|
||||
mut visited := []string{init: vertex}
|
||||
mut visited := []string{len: 6, init: vertex}
|
||||
mut queue := [][][]string{}
|
||||
queue << [[vertex], path]
|
||||
for queue.len > 0 {
|
||||
|
@ -1,6 +1,6 @@
|
||||
vlib/v/checker/tests/assign_expr_undefined_err_i.vv:2:23: error: undefined variable: `a`
|
||||
vlib/v/checker/tests/assign_expr_undefined_err_i.vv:2:31: error: undefined variable: `a`
|
||||
1 | fn main() {
|
||||
2 | mut a := []int{init: a}
|
||||
| ^
|
||||
2 | mut a := []int{len: 1, init: a}
|
||||
| ^
|
||||
3 | println(a)
|
||||
4 | }
|
||||
|
@ -1,4 +1,4 @@
|
||||
fn main() {
|
||||
mut a := []int{init: a}
|
||||
mut a := []int{len: 1, init: a}
|
||||
println(a)
|
||||
}
|
||||
|
@ -80,18 +80,18 @@ vlib/v/checker/tests/optional_fn_err.vv:56:8: error: bar() returns an option, so
|
||||
55 | // init
|
||||
56 | _ := [bar(0)]
|
||||
| ~~~~~~
|
||||
57 | _ := []int{init: bar(0)}
|
||||
57 | _ := []int{len: 1, init: bar(0)}
|
||||
58 | _ := [bar(0)]!
|
||||
vlib/v/checker/tests/optional_fn_err.vv:57:19: error: bar() returns an option, so it should have either an `or {}` block, or `?` at the end
|
||||
vlib/v/checker/tests/optional_fn_err.vv:57:27: error: bar() returns an option, so it should have either an `or {}` block, or `?` at the end
|
||||
55 | // init
|
||||
56 | _ := [bar(0)]
|
||||
57 | _ := []int{init: bar(0)}
|
||||
| ~~~~~~
|
||||
57 | _ := []int{len: 1, init: bar(0)}
|
||||
| ~~~~~~
|
||||
58 | _ := [bar(0)]!
|
||||
59 | _ := [1]int{init: bar(0)}
|
||||
vlib/v/checker/tests/optional_fn_err.vv:58:8: error: bar() returns an option, so it should have either an `or {}` block, or `?` at the end
|
||||
56 | _ := [bar(0)]
|
||||
57 | _ := []int{init: bar(0)}
|
||||
57 | _ := []int{len: 1, init: bar(0)}
|
||||
58 | _ := [bar(0)]!
|
||||
| ~~~~~~
|
||||
59 | _ := [1]int{init: bar(0)}
|
||||
|
@ -54,7 +54,7 @@ fn main() {
|
||||
arr << bar(0)
|
||||
// init
|
||||
_ := [bar(0)]
|
||||
_ := []int{init: bar(0)}
|
||||
_ := []int{len: 1, init: bar(0)}
|
||||
_ := [bar(0)]!
|
||||
_ := [1]int{init: bar(0)}
|
||||
// index
|
||||
|
@ -4,6 +4,7 @@
|
||||
module parser
|
||||
|
||||
import v.ast
|
||||
import v.token
|
||||
|
||||
fn (mut p Parser) array_init() ast.ArrayInit {
|
||||
first_pos := p.tok.pos()
|
||||
@ -132,10 +133,12 @@ fn (mut p Parser) array_init() ast.ArrayInit {
|
||||
mut has_cap := false
|
||||
mut len_expr := ast.empty_expr
|
||||
mut cap_expr := ast.empty_expr
|
||||
mut attr_pos := token.Pos{}
|
||||
if p.tok.kind == .lcbr && exprs.len == 0 && array_type != ast.void_type {
|
||||
// `[]int{ len: 10, cap: 100}` syntax
|
||||
p.next()
|
||||
for p.tok.kind != .rcbr {
|
||||
attr_pos = p.tok.pos()
|
||||
key := p.check_name()
|
||||
p.check(.colon)
|
||||
match key {
|
||||
@ -172,6 +175,10 @@ fn (mut p Parser) array_init() ast.ArrayInit {
|
||||
}
|
||||
}
|
||||
p.check(.rcbr)
|
||||
if has_default && !has_len {
|
||||
p.error_with_pos('cannot use `init` attribute unless `len` attribute is also provided',
|
||||
attr_pos)
|
||||
}
|
||||
}
|
||||
pos := first_pos.extend_with_last_line(last_pos, p.prev_tok.line_nr)
|
||||
return ast.ArrayInit{
|
||||
|
@ -0,0 +1,7 @@
|
||||
vlib/v/parser/tests/array_init_given_len_not_given_err.vv:8:27: error: cannot use `init` attribute unless `len` attribute is also provided
|
||||
6 |
|
||||
7 | fn main() {
|
||||
8 | mut list_elem := [][]f64{init: [0.0, 0.0]}
|
||||
| ~~~~
|
||||
9 | mut elem := 0.0
|
||||
10 | for i in 0 .. lenn {
|
15
vlib/v/parser/tests/array_init_given_len_not_given_err.vv
Normal file
15
vlib/v/parser/tests/array_init_given_len_not_given_err.vv
Normal file
@ -0,0 +1,15 @@
|
||||
import rand
|
||||
|
||||
const (
|
||||
lenn = 100
|
||||
)
|
||||
|
||||
fn main() {
|
||||
mut list_elem := [][]f64{init: [0.0, 0.0]}
|
||||
mut elem := 0.0
|
||||
for i in 0 .. lenn {
|
||||
elem = rand.int_in_range(-100000000, 100000001)!
|
||||
list_elem[i] << [elem, elem]
|
||||
}
|
||||
println(list_elem)
|
||||
}
|
Loading…
Reference in New Issue
Block a user