diff options
author | Ivan Bobev <bobeff@protonmail.ch> | 2020-11-06 20:56:09 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-06 18:56:09 +0000 |
commit | 3c85aa9e53cbaae5fae83f9fd29de3bdb107c7aa (patch) | |
tree | d014b546d43997de23e1f95b78e40536ba6b179c /tests | |
parent | 60c364fb224a8b55dc7cacc5a589c569cf202ec5 (diff) | |
download | Nim-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 'tests')
-rw-r--r-- | tests/distinct/tdistinct.nim | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/tests/distinct/tdistinct.nim b/tests/distinct/tdistinct.nim index 2c0196745..d64f33443 100644 --- a/tests/distinct/tdistinct.nim +++ b/tests/distinct/tdistinct.nim @@ -106,3 +106,35 @@ type FooD = distinct int proc `<=`(a, b: FooD): bool {.borrow.} for f in [FooD(0): "Foo"]: echo f + +block tRequiresInit: + template accept(x) = + static: doAssert compiles(x) + + template reject(x) = + static: doAssert not compiles(x) + + type + Foo = object + x: string + + DistinctFoo {.requiresInit, borrow: `.`.} = distinct Foo + DistinctString {.requiresInit.} = distinct string + + reject: + var foo: DistinctFoo + foo.x = "test" + doAssert foo.x == "test" + + accept: + let foo = DistinctFoo(Foo(x: "test")) + doAssert foo.x == "test" + + reject: + var s: DistinctString + s = "test" + doAssert s == "test" + + accept: + let s = "test" + doAssert s == "test" |