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}