docs: move not nil to the experimental page (#14027)

When I heard that this feature existed, and found the 2018 changelog entry that said `not nil` was made experimental (https://github.com/nim-lang/Nim/blob/devel/changelogs/changelog_0_19_0.md#changes-affecting-backwards-compatibility), I looked for `not nil` documentation in https://nim-lang.org/docs/manual_experimental.html. When I didn’t find it there, I initially assumed the feature had no documentation. This change moves the documentation to where readers will expect it.

As well as moving the text to another file, I added instructions for enabling the experimental feature and tweaked some wording.
This commit is contained in:
Rory O’Kane 2020-04-21 08:54:43 -04:00 • committed by GitHub
commit b8b0e9b21d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 26 deletions

View file

@ -1851,32 +1851,6 @@ details like this when mixing garbage collected data with unmanaged memory.
.. XXX finalizers for traced objects .. XXX finalizers for traced objects
Not nil annotation
------------------
All types for which ``nil`` is a valid value can be annotated to
exclude ``nil`` as a valid value with the ``not nil`` annotation:
.. code-block:: nim
type
PObject = ref TObj not nil
TProc = (proc (x, y: int)) not nil
proc p(x: PObject) =
echo "not nil"
# compiler catches this:
p(nil)
# and also this:
var x: PObject
p(x)
The compiler ensures that every code path initializes variables which contain
non nilable pointers. The details of this analysis are still to be specified
here.
Procedural type Procedural type
--------------- ---------------
A procedural type is internally a pointer to a procedure. ``nil`` is A procedural type is internally a pointer to a procedure. ``nil`` is

View file

@ -340,6 +340,36 @@ This operator will be matched against assignments to missing fields.
a.b = c # becomes `.=`(a, b, c) a.b = c # becomes `.=`(a, b, c)
Not nil annotation
==================
**Note:** This is an experimental feature. It can be enabled with
``{.experimental: "notnil"}``.
All types for which ``nil`` is a valid value can be annotated with the ``not
nil`` annotation to exclude ``nil`` as a valid value:
.. code-block:: nim
{.experimental: "notnil"}
type
PObject = ref TObj not nil
TProc = (proc (x, y: int)) not nil
proc p(x: PObject) =
echo "not nil"
# compiler catches this:
p(nil)
# and also this:
var x: PObject
p(x)
The compiler ensures that every code path initializes variables which contain
non-nilable pointers. The details of this analysis are still to be specified
here.
Concepts Concepts
======== ========