From a64b191ce5c3d2ded444e995a3675bced642ec92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20D=C3=A4schle?= Date: Mon, 9 Aug 2021 01:11:53 +0200 Subject: [PATCH] checker: forbid multiple pointer yields (#11105) --- vlib/v/checker/checker.v | 7 +++++++ vlib/v/checker/tests/multiple_pointer_yield_err.out | 6 ++++++ vlib/v/checker/tests/multiple_pointer_yield_err.vv | 10 ++++++++++ 3 files changed, 23 insertions(+) create mode 100644 vlib/v/checker/tests/multiple_pointer_yield_err.out create mode 100644 vlib/v/checker/tests/multiple_pointer_yield_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 9bffdb72ab..3690911bf2 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -7117,6 +7117,13 @@ pub fn (mut c Checker) prefix_expr(mut node ast.PrefixExpr) ast.Type { right_type := c.expr(node.right) c.inside_ref_lit = old_inside_ref_lit node.right_type = right_type + if node.op == .amp { + if mut node.right is ast.PrefixExpr { + if node.right.op == .amp { + c.error('unexpected `&`, expecting expression', node.right.pos) + } + } + } // TODO: testing ref/deref strategy if node.op == .amp && !right_type.is_ptr() { mut expr := node.right diff --git a/vlib/v/checker/tests/multiple_pointer_yield_err.out b/vlib/v/checker/tests/multiple_pointer_yield_err.out new file mode 100644 index 0000000000..6fd41271b8 --- /dev/null +++ b/vlib/v/checker/tests/multiple_pointer_yield_err.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/multiple_pointer_yield_err.vv:9:8: error: unexpected `&`, expecting expression + 7 | fn main() { + 8 | f := Fail{} + 9 | foo(&&&f) + | ^ + 10 | } diff --git a/vlib/v/checker/tests/multiple_pointer_yield_err.vv b/vlib/v/checker/tests/multiple_pointer_yield_err.vv new file mode 100644 index 0000000000..0cad12be24 --- /dev/null +++ b/vlib/v/checker/tests/multiple_pointer_yield_err.vv @@ -0,0 +1,10 @@ +struct Fail { + name string +} + +fn foo(bar &&&Fail) {} + +fn main() { + f := Fail{} + foo(&&&f) +}