From bb91dc90a52c4a2b9d9455c966449bbe8eb0ac68 Mon Sep 17 00:00:00 2001 From: spaceface777 Date: Tue, 10 Nov 2020 12:12:21 +0100 Subject: [PATCH] checker: fix `&` on pointers (#6787) --- vlib/v/checker/checker.v | 2 ++ vlib/v/tests/unsafe_test.v | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 1f0f1375c9..db5d9514cf 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2856,6 +2856,8 @@ pub fn (mut c Checker) expr(node ast.Expr) table.Type { } } return right_type.to_ptr() + } else if node.op == .amp && node.right !is ast.CastExpr { + return right_type.to_ptr() } if node.op == .mul { if right_type.is_ptr() { diff --git a/vlib/v/tests/unsafe_test.v b/vlib/v/tests/unsafe_test.v index 0df136baeb..601fc45c0f 100644 --- a/vlib/v/tests/unsafe_test.v +++ b/vlib/v/tests/unsafe_test.v @@ -14,6 +14,26 @@ fn test_ptr_assign() { assert v[3] == 31 } +fn test_double_ptr() { + i := 5 + j := 7 + unsafe { + mut x := &i + mut p := &x + (*p) = &j + assert x == &j + } + + ///////// + + mut x := &int(0) + unsafe { + mut p := &x + (*p) = &int(1) + } + assert ptr_str(x) == ptr_str(&int(1)) +} + fn test_ptr_infix() { v := 4 mut q := unsafe {&v - 1}