From 915ab53b3ca3ff97ab8f70ee77c2aee2cafb2218 Mon Sep 17 00:00:00 2001 From: Swastik Date: Mon, 30 Sep 2024 00:24:28 +0530 Subject: [PATCH] checker: disallow invalid `T` cast --- vlib/v/checker/checker.v | 6 +++++ .../tests/globals/cast_expr_T_type_err.out | 14 ++++++++++++ .../tests/globals/cast_expr_T_type_err.vv | 22 +++++++++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 vlib/v/checker/tests/globals/cast_expr_T_type_err.out create mode 100644 vlib/v/checker/tests/globals/cast_expr_T_type_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 7a73c1a680130d..3022740d3b15a1 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -3191,6 +3191,12 @@ fn (mut c Checker) cast_expr(mut node ast.CastExpr) ast.Type { return to_type } + type_str := c.table.type_to_str(to_type) + type_rm_ptr := type_str.replace('&', '') + if type_rm_ptr.len == 1 && type_rm_ptr.starts_with_capital() { + c.error('unknown type `${to_sym.name}`', node.pos) + } + if to_sym.language != .c { c.ensure_type_exists(to_type, node.pos) diff --git a/vlib/v/checker/tests/globals/cast_expr_T_type_err.out b/vlib/v/checker/tests/globals/cast_expr_T_type_err.out new file mode 100644 index 00000000000000..1ddaafab2666f7 --- /dev/null +++ b/vlib/v/checker/tests/globals/cast_expr_T_type_err.out @@ -0,0 +1,14 @@ +vlib/v/checker/tests/globals/cast_expr_T_type_err.vv:4:7: error: unknown type `A` + 2 | + 3 | __global ( + 4 | fo = A(0) + | ~~~~ + 5 | fo1 = &A(0) + 6 | ) +vlib/v/checker/tests/globals/cast_expr_T_type_err.vv:5:8: error: unknown type `A` + 3 | __global ( + 4 | fo = A(0) + 5 | fo1 = &A(0) + | ~~~~~ + 6 | ) + 7 | diff --git a/vlib/v/checker/tests/globals/cast_expr_T_type_err.vv b/vlib/v/checker/tests/globals/cast_expr_T_type_err.vv new file mode 100644 index 00000000000000..cd2f9c3f445724 --- /dev/null +++ b/vlib/v/checker/tests/globals/cast_expr_T_type_err.vv @@ -0,0 +1,22 @@ +module main + +__global ( + fo = A(0) + fo1 = &A(0) +) + +fn main() { + +} + +module main + +__global ( + fo = A(0) + fo1 = &A(0) +) + +fn main() { + +} +