checker: check fixed array size (#8224)

pull/8237/head
yuyi 2021-01-21 05:17:49 +08:00 committed by GitHub
parent c212b4d180
commit 190bb38087
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 29 additions and 1 deletions

View File

@ -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

View File

@ -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)

View File

@ -0,0 +1,8 @@
const size = -1
fn main() {
a := [size]int{}
b := [0]byte{}
println(a)
println(b)
}

View File

@ -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)