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"
  ```
This commit is contained in:
Ivan Bobev
2020-11-06 20:56:09 +02:00
committed by GitHub
parent 60c364fb22
commit 3c85aa9e53
6 changed files with 82 additions and 9 deletions

View File

@@ -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
-------------