From aa28efc0b18a031475840170862555ff8d838899 Mon Sep 17 00:00:00 2001 From: shove Date: Sun, 29 Oct 2023 20:33:33 +0800 Subject: [PATCH] checker: fix negative cap, len checks in array init (#19694) --- vlib/v/checker/containers.v | 6 ++++++ vlib/v/checker/tests/array_init_with_len_cap_err.out | 8 ++++++++ vlib/v/checker/tests/array_init_with_len_cap_err.vv | 2 ++ 3 files changed, 16 insertions(+) create mode 100644 vlib/v/checker/tests/array_init_with_len_cap_err.out create mode 100644 vlib/v/checker/tests/array_init_with_len_cap_err.vv diff --git a/vlib/v/checker/containers.v b/vlib/v/checker/containers.v index dc641bf40..cea9d2cee 100644 --- a/vlib/v/checker/containers.v +++ b/vlib/v/checker/containers.v @@ -338,6 +338,12 @@ fn (mut c Checker) check_array_init_para_type(para string, mut expr ast.Expr, po if sym.kind !in [.int, .int_literal] { c.error('array ${para} needs to be an int', pos) } + if expr is ast.IntegerLiteral { + lit := expr as ast.IntegerLiteral + if lit.val.int() < 0 { + c.error('array ${para} can not be negative', lit.pos) + } + } } fn (mut c Checker) ensure_sumtype_array_has_default_value(node ast.ArrayInit) { diff --git a/vlib/v/checker/tests/array_init_with_len_cap_err.out b/vlib/v/checker/tests/array_init_with_len_cap_err.out new file mode 100644 index 000000000..e094580ce --- /dev/null +++ b/vlib/v/checker/tests/array_init_with_len_cap_err.out @@ -0,0 +1,8 @@ +vlib/v/checker/tests/array_init_with_len_cap_err.vv:1:16: error: array len can not be negative + 1 | _ = []int{len: -1} + | ~~ + 2 | _ = []int{cap: -1} +vlib/v/checker/tests/array_init_with_len_cap_err.vv:2:16: error: array cap can not be negative + 1 | _ = []int{len: -1} + 2 | _ = []int{cap: -1} + | ~~ diff --git a/vlib/v/checker/tests/array_init_with_len_cap_err.vv b/vlib/v/checker/tests/array_init_with_len_cap_err.vv new file mode 100644 index 000000000..f1ce99a04 --- /dev/null +++ b/vlib/v/checker/tests/array_init_with_len_cap_err.vv @@ -0,0 +1,2 @@ +_ = []int{len: -1} +_ = []int{cap: -1} -- 2.39.5