From d523bb0306a72e86094842570df6f0671bd257c7 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 27 Jun 2023 04:54:03 -0300 Subject: [PATCH] checker: fix missing check for taking address of literal value member (#18570) --- vlib/v/checker/checker.v | 3 +++ vlib/v/checker/tests/prefix_addr_err.out | 10 ++++++++++ vlib/v/checker/tests/prefix_addr_err.vv | 3 +++ 3 files changed, 16 insertions(+) create mode 100644 vlib/v/checker/tests/prefix_addr_err.out create mode 100644 vlib/v/checker/tests/prefix_addr_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 738386b30c..c3429549c5 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -3906,6 +3906,9 @@ fn (mut c Checker) prefix_expr(mut node ast.PrefixExpr) ast.Type { c.error('unexpected `&`, expecting expression', node.right.pos) } } else if mut node.right is ast.SelectorExpr { + if node.right.expr.is_literal() { + c.error('cannot take the address of a literal value', node.pos.extend(node.right.pos)) + } right_sym := c.table.sym(right_type) expr_sym := c.table.sym(node.right.expr_type) if expr_sym.kind == .struct_ && (expr_sym.info as ast.Struct).is_minify diff --git a/vlib/v/checker/tests/prefix_addr_err.out b/vlib/v/checker/tests/prefix_addr_err.out new file mode 100644 index 0000000000..3dfa445721 --- /dev/null +++ b/vlib/v/checker/tests/prefix_addr_err.out @@ -0,0 +1,10 @@ +vlib/v/checker/tests/prefix_addr_err.vv:2:2: warning: unused variable: `b` + 1 | fn main() { + 2 | b := &'foo'.len + | ^ + 3 | } +vlib/v/checker/tests/prefix_addr_err.vv:2:7: error: cannot take the address of a literal value + 1 | fn main() { + 2 | b := &'foo'.len + | ~~~~~~~~~~ + 3 | } diff --git a/vlib/v/checker/tests/prefix_addr_err.vv b/vlib/v/checker/tests/prefix_addr_err.vv new file mode 100644 index 0000000000..51da8bab1f --- /dev/null +++ b/vlib/v/checker/tests/prefix_addr_err.vv @@ -0,0 +1,3 @@ +fn main() { + b := &'foo'.len +}