From ac643188909bab5df043eaa2a4857f07603d03ed Mon Sep 17 00:00:00 2001 From: yuyi Date: Wed, 14 Sep 2022 01:41:20 +0800 Subject: [PATCH] checker: check casting array to number (#15750) --- vlib/v/checker/checker.v | 4 ++++ vlib/v/checker/tests/cast_array_to_number_err.out | 7 +++++++ vlib/v/checker/tests/cast_array_to_number_err.vv | 8 ++++++++ 3 files changed, 19 insertions(+) create mode 100644 vlib/v/checker/tests/cast_array_to_number_err.out create mode 100644 vlib/v/checker/tests/cast_array_to_number_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 6acd3fb63f..e7737f4655 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2506,6 +2506,10 @@ pub fn (mut c Checker) cast_expr(mut node ast.CastExpr) ast.Type { snexpr := node.expr.str() tt := c.table.type_to_str(to_type) c.error('cannot cast string to `$tt`, use `${snexpr}.str` instead.', node.pos) + } else if final_from_sym.kind == .array && !from_type.is_ptr() && to_type != ast.string_type { + ft := c.table.type_to_str(from_type) + tt := c.table.type_to_str(to_type) + c.error('cannot cast array `$ft` to `$tt`', node.pos) } if to_sym.kind == .rune && from_sym.is_string() { diff --git a/vlib/v/checker/tests/cast_array_to_number_err.out b/vlib/v/checker/tests/cast_array_to_number_err.out new file mode 100644 index 0000000000..3b582f504a --- /dev/null +++ b/vlib/v/checker/tests/cast_array_to_number_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/cast_array_to_number_err.vv:5:8: error: cannot cast array `[]u8` to `i16` + 3 | fn main() { + 4 | bytes := '010000150107120508d37445a0d7e5c5071980710c64310d9e12043000777369ff0424ab78b91a05164b00e50034003300' + 5 | yr := i16(hx.decode(bytes.substr(6,8))?) + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 6 | println(bytes) + 7 | println('yr: $yr') diff --git a/vlib/v/checker/tests/cast_array_to_number_err.vv b/vlib/v/checker/tests/cast_array_to_number_err.vv new file mode 100644 index 0000000000..167e378237 --- /dev/null +++ b/vlib/v/checker/tests/cast_array_to_number_err.vv @@ -0,0 +1,8 @@ +import encoding.hex as hx + +fn main() { + bytes := '010000150107120508d37445a0d7e5c5071980710c64310d9e12043000777369ff0424ab78b91a05164b00e50034003300' + yr := i16(hx.decode(bytes.substr(6,8))?) + println(bytes) + println('yr: $yr') +}