diff options
author | Timothee Cour <timothee.cour2@gmail.com> | 2020-03-23 03:15:45 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-23 11:15:45 +0100 |
commit | 913bc95964458d3eb2fc4d8a108031e6b9398da5 (patch) | |
tree | f66dc374d3ff53ff444e4975cfd40ec14916291c /tests/stdlib | |
parent | fa06203e90d9bb9211d0b6b9726fc9f2c5dc80ad (diff) | |
download | Nim-913bc95964458d3eb2fc4d8a108031e6b9398da5.tar.gz |
new syntax for lvalue references: `var b {.byaddr.} = expr` (#13508)
* new syntax for lvalue references: `var b {.byaddr.} = expr` * on type mismatch, `???(0, 0)` not shown anymore * * compiler now lowers `var a: {.foo.}: MyType = expr` to foo(a, MyType, expr) * new pragmas.byaddr defined in pure library code exploiting this lowering * skip `template foo() {.pragma.}`
Diffstat (limited to 'tests/stdlib')
-rw-r--r-- | tests/stdlib/tpragmas.nim | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/tests/stdlib/tpragmas.nim b/tests/stdlib/tpragmas.nim new file mode 100644 index 000000000..b91d7e547 --- /dev/null +++ b/tests/stdlib/tpragmas.nim @@ -0,0 +1,70 @@ +import std/pragmas + +block: + var s = @[10,11,12] + var a {.byaddr.} = s[0] + a+=100 + doAssert s == @[110,11,12] + doAssert a is int + var b {.byaddr.}: int = s[0] + doAssert a.addr == b.addr + + doAssert not compiles(block: + # redeclaration not allowed + var foo = 0 + var foo {.byaddr.} = s[0]) + + doAssert not compiles(block: + # ditto + var foo {.byaddr.} = s[0] + var foo {.byaddr.} = s[0]) + + block: + var b {.byaddr.} = s[1] # redeclaration ok in sub scope + b = 123 + + doAssert s == @[110,123,12] + + b = b * 10 + doAssert s == @[1100,123,12] + + doAssert not compiles(block: + var b2 {.byaddr.}: float = s[2]) + + doAssert compiles(block: + var b2 {.byaddr.}: int = s[2]) + +## We can define custom pragmas in user code +template byUnsafeAddr(lhs, typ, expr) = + when typ is type(nil): + let tmp = unsafeAddr(expr) + else: + let tmp: ptr typ = unsafeAddr(expr) + template lhs: untyped = tmp[] + +block: + let s = @["foo", "bar"] + let a {.byUnsafeAddr.} = s[0] + doAssert a == "foo" + doAssert a[0].unsafeAddr == s[0][0].unsafeAddr + +block: # nkAccQuoted + # shows using a keyword, which requires nkAccQuoted + template `cast`(lhs, typ, expr) = + when typ is type(nil): + let tmp = unsafeAddr(expr) + else: + let tmp: ptr typ = unsafeAddr(expr) + template lhs: untyped = tmp[] + + block: + let s = @["foo", "bar"] + let a {.`byUnsafeAddr`.} = s[0] + doAssert a == "foo" + doAssert a[0].unsafeAddr == s[0][0].unsafeAddr + + block: + let s = @["foo", "bar"] + let a {.`cast`.} = s[0] + doAssert a == "foo" + doAssert a[0].unsafeAddr == s[0][0].unsafeAddr |