summary refs log tree commit diff stats
path: root/doc/manual.rst
diff options
context:
space:
mode:
authorIvan Bobev <bobeff@protonmail.ch>2020-11-06 20:56:09 +0200
committerGitHub <noreply@github.com>2020-11-06 18:56:09 +0000
commit3c85aa9e53cbaae5fae83f9fd29de3bdb107c7aa (patch)
treed014b546d43997de23e1f95b78e40536ba6b179c /doc/manual.rst
parent60c364fb224a8b55dc7cacc5a589c569cf202ec5 (diff)
downloadNim-3c85aa9e53cbaae5fae83f9fd29de3bdb107c7aa.tar.gz
Make `{.requiresInit.}` to work for distinct types (#15869)
Make `requiresInit` pragma to work for distinct types in addition to
objects. Tagging of distinct types with `requiresInit` pragma was
already supported, but its impact wasn't applied. Now its behavior when
applied on distinct types is as follows.

Given the following distinct type definitions:

  ```nim
  type
    DistinctObject {.requiresInit, borrow: `.`.} = distinct MyObject
    DistinctString {.requiresInit.} = distinct string
  ```

The following code blocks will fail to compile:

  ```nim
  var foo: DistinctFoo
  foo.x = "test"
  doAssert foo.x == "test"
  ```

  ```nim
  var s: DistinctString
  s = "test"
  doAssert s == "test"
  ```

But these ones will compile successfully:

  ```nim
  let foo = DistinctFoo(Foo(x: "test"))
  doAssert foo.x == "test"
  ```

  ```nim
  let s = "test"
  doAssert s == "test"
  ```
Diffstat (limited to 'doc/manual.rst')
-rw-r--r--doc/manual.rst30
1 files changed, 30 insertions, 0 deletions
diff --git a/doc/manual.rst b/doc/manual.rst
index d9f9cc9b9..4e5b861b1 100644
--- a/doc/manual.rst
+++ b/doc/manual.rst
@@ -2697,6 +2697,36 @@ the variable has been initialized and does not rely on syntactic properties:
       x = a()
     # use x
 
+`requiresInit` pragma can also be applyied to `distinct` types.
+
+Given the following distinct type definitions:
+
+.. code-block:: nim
+  type
+    DistinctObject {.requiresInit, borrow: `.`.} = distinct MyObject
+    DistinctString {.requiresInit.} = distinct string
+
+The following code blocks will fail to compile:
+
+.. code-block:: nim
+  var foo: DistinctFoo
+  foo.x = "test"
+  doAssert foo.x == "test"
+
+.. code-block:: nim
+  var s: DistinctString
+  s = "test"
+  doAssert s == "test"
+
+But these ones will compile successfully:
+
+.. code-block:: nim
+  let foo = DistinctFoo(Foo(x: "test"))
+  doAssert foo.x == "test"
+
+.. code-block:: nim
+  let s = "test"
+  doAssert s == "test"
 
 Let statement
 -------------