From acc5c95f0df9a85ce869bd3f90496487e63a2070 Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Mon, 24 Aug 2020 16:19:17 +0100 Subject: [PATCH] checker: error with `*expr` if not a pointer (#6211) --- vlib/v/checker/checker.v | 10 ++++++++-- vlib/v/checker/tests/prefix_err.out | 24 ++++++++++++++++++++++++ vlib/v/checker/tests/prefix_err.vv | 6 ++++++ vlib/x/net/address.v | 4 ++-- 4 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 vlib/v/checker/tests/prefix_err.out create mode 100644 vlib/v/checker/tests/prefix_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 1357d66f63..b3fff38ea0 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2453,8 +2453,14 @@ pub fn (mut c Checker) expr(node ast.Expr) table.Type { if node.op == .amp && !right_type.is_ptr() { return right_type.to_ptr() } - if node.op == .mul && right_type.is_ptr() { - return right_type.deref() + if node.op == .mul { + if right_type.is_ptr() { + return right_type.deref() + } + if !right_type.is_pointer() { + s := c.table.type_to_str(right_type) + c.error('prefix operator `*` not defined for type `$s`', node.pos) + } } if node.op == .bit_not && !right_type.is_int() && !c.pref.translated { c.error('operator ~ only defined on int types', node.pos) diff --git a/vlib/v/checker/tests/prefix_err.out b/vlib/v/checker/tests/prefix_err.out new file mode 100644 index 0000000000..95dfbb4dfd --- /dev/null +++ b/vlib/v/checker/tests/prefix_err.out @@ -0,0 +1,24 @@ +vlib/v/checker/tests/prefix_err.v:2:5: error: prefix operator `*` not defined for type `int` + 1 | a := 1 + 2 | _ = *a + | ^ + 3 | a <- 4 + 4 | +vlib/v/checker/tests/prefix_err.v:3:1: error: cannot push on non-channel `int` + 1 | a := 1 + 2 | _ = *a + 3 | a <- 4 + | ^ + 4 | + 5 | _ = ~true +vlib/v/checker/tests/prefix_err.v:5:5: error: operator ~ only defined on int types + 3 | a <- 4 + 4 | + 5 | _ = ~true + | ^ + 6 | _ = !4 +vlib/v/checker/tests/prefix_err.v:6:5: error: ! operator can only be used with bool types + 4 | + 5 | _ = ~true + 6 | _ = !4 + | ^ diff --git a/vlib/v/checker/tests/prefix_err.vv b/vlib/v/checker/tests/prefix_err.vv new file mode 100644 index 0000000000..6d5629f08a --- /dev/null +++ b/vlib/v/checker/tests/prefix_err.vv @@ -0,0 +1,6 @@ +a := 1 +_ = *a +a <- 4 + +_ = ~true +_ = !4 diff --git a/vlib/x/net/address.v b/vlib/x/net/address.v index cf46f26c09..3ca3248559 100644 --- a/vlib/x/net/address.v +++ b/vlib/x/net/address.v @@ -63,7 +63,7 @@ pub fn resolve_addr(addr string, family SocketFamily, typ SocketType) ?Addr { sport := '$port' - // This might look silly but is reccomended by MSDN + // This might look silly but is recommended by MSDN $if windows { socket_error(0-C.getaddrinfo(address.str, sport.str, &hints, &info))? } $else { @@ -71,4 +71,4 @@ pub fn resolve_addr(addr string, family SocketFamily, typ SocketType) ?Addr { } return new_addr(*info.ai_addr, address, port) -} \ No newline at end of file +}