diff --git a/doc/manual.rst b/doc/manual.rst index 84cf1d8c97cd..5ef3f8d3a4e8 100644 --- a/doc/manual.rst +++ b/doc/manual.rst @@ -1838,32 +1838,6 @@ details like this when mixing garbage collected data with unmanaged memory. .. 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 --------------- A procedural type is internally a pointer to a procedure. ``nil`` is diff --git a/doc/manual_experimental.rst b/doc/manual_experimental.rst index 8c61c1217747..f65c0933b7a5 100644 --- a/doc/manual_experimental.rst +++ b/doc/manual_experimental.rst @@ -340,6 +340,36 @@ This operator will be matched against assignments to missing fields. 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 ========