diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2018-04-21 16:41:35 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-04-21 17:01:33 +0200 |
commit | 4f10b5edb6a6e51da5a3f8b0156a456d6eba8727 (patch) | |
tree | 47f3375c30e6131eb4175427725a46d6d6f54b8d /doc/manual | |
parent | e44c6d833799d42fac0445cfcbf4b2e75e70358f (diff) | |
download | Nim-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.rst | 20 |
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. |