From 90287f6aaae2148285f5b9b88d02d1056d56cb17 Mon Sep 17 00:00:00 2001 From: yuyi Date: Sat, 25 Jun 2022 10:19:16 +0800 Subject: [PATCH] checker: check error for cast sumtype (fix #14771) (#14847) --- vlib/v/checker/checker.v | 8 ++++++++ vlib/v/checker/tests/cast_sumtype_err.out | 6 ++++++ vlib/v/checker/tests/cast_sumtype_err.vv | 8 ++++++++ 3 files changed, 22 insertions(+) create mode 100644 vlib/v/checker/tests/cast_sumtype_err.out create mode 100644 vlib/v/checker/tests/cast_sumtype_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 46334c1052..33556a2e71 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2500,6 +2500,14 @@ pub fn (mut c Checker) cast_expr(mut node ast.CastExpr) ast.Type { c.error(error_msg, node.pos) } } + if from_sym.language == .v && !from_type.is_ptr() + && final_from_sym.kind in [.sum_type, .interface_] + && final_to_sym.kind !in [.sum_type, .interface_] { + ft := c.table.type_to_str(from_type) + tt := c.table.type_to_str(to_type) + c.error('cannot cast `$ft` to `$tt`, please use `as` instead, e.g. `expr as Ident`', + node.pos) + } if node.has_arg { c.expr(node.arg) diff --git a/vlib/v/checker/tests/cast_sumtype_err.out b/vlib/v/checker/tests/cast_sumtype_err.out new file mode 100644 index 0000000000..48da4e3da7 --- /dev/null +++ b/vlib/v/checker/tests/cast_sumtype_err.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/cast_sumtype_err.vv:7:14: error: cannot cast `Test` to `int`, please use `as` instead, e.g. `expr as Ident` + 5 | fn main() { + 6 | data := Test(12) + 7 | eprintln(int(data)) + | ~~~~~~~~~ + 8 | } diff --git a/vlib/v/checker/tests/cast_sumtype_err.vv b/vlib/v/checker/tests/cast_sumtype_err.vv new file mode 100644 index 0000000000..1178514fd3 --- /dev/null +++ b/vlib/v/checker/tests/cast_sumtype_err.vv @@ -0,0 +1,8 @@ +module main + +type Test = int | u32 | f32 + +fn main() { + data := Test(12) + eprintln(int(data)) +}