From 83afa1009ea8aed5a7b7a78215daefe08aa7cbd8 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Mon, 10 Apr 2023 04:59:36 +0200 Subject: [PATCH] checker: fix immutable deref check --- vlib/v/checker/checker.v | 7 ++++++- vlib/v/checker/tests/immutable_deref.out | 0 vlib/v/checker/tests/immutable_deref.vv | 12 ++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 vlib/v/checker/tests/immutable_deref.out create mode 100644 vlib/v/checker/tests/immutable_deref.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 207ce14c1f..1f83d5fa55 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -707,7 +707,12 @@ fn (mut c Checker) fail_if_immutable(expr_ ast.Expr) (string, token.Pos) { to_lock, pos = c.fail_if_immutable(expr.expr) } ast.PrefixExpr { - to_lock, pos = c.fail_if_immutable(expr.right) + if expr.op == .mul && expr.right is ast.Ident { + // Do not fail if dereference is immutable: + // `*x = foo()` doesn't modify `x` + } else { + to_lock, pos = c.fail_if_immutable(expr.right) + } } ast.PostfixExpr { to_lock, pos = c.fail_if_immutable(expr.expr) diff --git a/vlib/v/checker/tests/immutable_deref.out b/vlib/v/checker/tests/immutable_deref.out new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vlib/v/checker/tests/immutable_deref.vv b/vlib/v/checker/tests/immutable_deref.vv new file mode 100644 index 0000000000..e5021e785e --- /dev/null +++ b/vlib/v/checker/tests/immutable_deref.vv @@ -0,0 +1,12 @@ +struct Context {} + +const ctx_ptr = &Context(unsafe { nil }) + +fn main() { + // TODO unsafe bug, having this declaration inside `unsafe` results in an erro + x := &ctx_ptr + unsafe { + *x = &Context{} + _ = x + } +}