summary refs log tree commit diff stats
path: root/doc/manual
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2018-04-21 16:41:35 +0200
committerAndreas Rumpf <rumpf_a@web.de>2018-04-21 17:01:33 +0200
commit4f10b5edb6a6e51da5a3f8b0156a456d6eba8727 (patch)
tree47f3375c30e6131eb4175427725a46d6d6f54b8d /doc/manual
parente44c6d833799d42fac0445cfcbf4b2e75e70358f (diff)
downloadNim-4f10b5edb6a6e51da5a3f8b0156a456d6eba8727.tar.gz
improve documentation for 'var T return values'; refs #7373
Diffstat (limited to 'doc/manual')
-rw-r--r--doc/manual/var_t_return.rst20
1 files changed, 20 insertions, 0 deletions
diff --git a/doc/manual/var_t_return.rst b/doc/manual/var_t_return.rst
new file mode 100644
index 000000000..b9ff1d892
--- /dev/null
+++ b/doc/manual/var_t_return.rst
@@ -0,0 +1,20 @@
+Memory safety for returning by ``var T`` is ensured by a simple borrowing
+rule: If ``result`` does not refer to a location pointing to the heap
+(that is in ``result = X`` the ``X`` involves a ``ptr`` or ``ref`` access)
+then it has to be deviated by the routine's first parameter:
+
+.. code-block:: nim
+  proc forward[T](x: var T): var T =
+    result = x # ok, deviated from the first parameter.
+
+  proc p(param: var int): var int =
+    var x: int
+    # we know 'forward' provides a view into the location deviated by
+    # its first argument 'x'.
+    result = forward(x) # Error: location is derived from ``x``
+                        # which is not p's first parameter and lives
+                        # on the stack.
+
+In other words, the lifetime of what ``result`` points to is attached to the
+lifetime of the first parameter and that is enough knowledge to verify
+memory safety at the callsite.