diff --git a/vlib/v/ast/types.v b/vlib/v/ast/types.v index ce3104ee0e..1e05d7272b 100644 --- a/vlib/v/ast/types.v +++ b/vlib/v/ast/types.v @@ -331,6 +331,11 @@ pub fn (typ Type) is_pointer() bool { return typ.idx() in ast.pointer_type_idxs } +[inline] +pub fn (typ Type) is_voidptr() bool { + return typ.idx() == ast.voidptr_type_idx +} + [inline] pub fn (typ Type) is_real_pointer() bool { return typ.is_ptr() || typ.is_pointer() diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 76810d4acf..441e2c36af 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -3305,6 +3305,9 @@ pub fn (mut c Checker) prefix_expr(mut node ast.PrefixExpr) ast.Type { s := c.table.type_to_str(right_type) c.error('invalid indirect of `$s`', node.pos) } + if right_type.is_voidptr() { + c.error('cannot dereference to void', node.pos) + } } if node.op == .bit_not && !right_type.is_int() && !c.pref.translated && !c.file.is_translated { c.error('operator ~ only defined on int types', node.pos) diff --git a/vlib/v/checker/tests/voidptr_dereference_err.out b/vlib/v/checker/tests/voidptr_dereference_err.out new file mode 100644 index 0000000000..54aeedf316 --- /dev/null +++ b/vlib/v/checker/tests/voidptr_dereference_err.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/voidptr_dereference_err.vv:5:10: error: cannot dereference to void + 3 | mut b := 123 + 4 | a = &b + 5 | println(*a) + | ^ + 6 | } \ No newline at end of file diff --git a/vlib/v/checker/tests/voidptr_dereference_err.vv b/vlib/v/checker/tests/voidptr_dereference_err.vv new file mode 100644 index 0000000000..97e46b5fdd --- /dev/null +++ b/vlib/v/checker/tests/voidptr_dereference_err.vv @@ -0,0 +1,6 @@ +fn main() { + mut a := voidptr(0) + mut b := 123 + a = &b + println(*a) +}