checker: check fixed array size (#8224)
parent
c212b4d180
commit
190bb38087
|
@ -2820,7 +2820,7 @@ pub fn (mut c Checker) array_init(mut array_init ast.ArrayInit) table.Type {
|
||||||
array_init.elem_type = elem_type
|
array_init.elem_type = elem_type
|
||||||
} else if array_init.is_fixed && array_init.exprs.len == 1 && array_init.elem_type != table.void_type {
|
} else if array_init.is_fixed && array_init.exprs.len == 1 && array_init.elem_type != table.void_type {
|
||||||
// [50]byte
|
// [50]byte
|
||||||
mut fixed_size := 1
|
mut fixed_size := 0
|
||||||
init_expr := array_init.exprs[0]
|
init_expr := array_init.exprs[0]
|
||||||
c.expr(init_expr)
|
c.expr(init_expr)
|
||||||
match init_expr {
|
match init_expr {
|
||||||
|
@ -2841,6 +2841,9 @@ pub fn (mut c Checker) array_init(mut array_init ast.ArrayInit) table.Type {
|
||||||
c.error('expecting `int` for fixed size', array_init.pos)
|
c.error('expecting `int` for fixed size', array_init.pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if fixed_size <= 0 {
|
||||||
|
c.error('fixed size cannot be zero or negative', init_expr.position())
|
||||||
|
}
|
||||||
idx := c.table.find_or_register_array_fixed(array_init.elem_type, fixed_size)
|
idx := c.table.find_or_register_array_fixed(array_init.elem_type, fixed_size)
|
||||||
array_type := table.new_type(idx)
|
array_type := table.new_type(idx)
|
||||||
array_init.typ = array_type
|
array_init.typ = array_type
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
vlib/v/checker/tests/fixed_array_size_err.vv:4:8: error: fixed size cannot be zero or negative
|
||||||
|
2 |
|
||||||
|
3 | fn main() {
|
||||||
|
4 | a := [size]int{}
|
||||||
|
| ~~~~
|
||||||
|
5 | b := [0]byte{}
|
||||||
|
6 | println(a)
|
||||||
|
vlib/v/checker/tests/fixed_array_size_err.vv:5:8: error: fixed size cannot be zero or negative
|
||||||
|
3 | fn main() {
|
||||||
|
4 | a := [size]int{}
|
||||||
|
5 | b := [0]byte{}
|
||||||
|
| ^
|
||||||
|
6 | println(a)
|
||||||
|
7 | println(b)
|
|
@ -0,0 +1,8 @@
|
||||||
|
const size = -1
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
a := [size]int{}
|
||||||
|
b := [0]byte{}
|
||||||
|
println(a)
|
||||||
|
println(b)
|
||||||
|
}
|
|
@ -40,6 +40,9 @@ pub fn (mut p Parser) parse_array_type() table.Type {
|
||||||
// error is handled by parse_type
|
// error is handled by parse_type
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
if fixed_size <= 0 {
|
||||||
|
p.error_with_pos('fixed size cannot be zero or negative', size_expr.position())
|
||||||
|
}
|
||||||
// sym := p.table.get_type_symbol(elem_type)
|
// sym := p.table.get_type_symbol(elem_type)
|
||||||
idx := p.table.find_or_register_array_fixed(elem_type, fixed_size)
|
idx := p.table.find_or_register_array_fixed(elem_type, fixed_size)
|
||||||
return table.new_type(idx)
|
return table.new_type(idx)
|
||||||
|
|
Loading…
Reference in New Issue