summary refs log tree commit diff stats
path: root/tests/stdlib
diff options
context:
space:
mode:
authorTimothee Cour <timothee.cour2@gmail.com>2020-03-23 03:15:45 -0700
committerGitHub <noreply@github.com>2020-03-23 11:15:45 +0100
commit913bc95964458d3eb2fc4d8a108031e6b9398da5 (patch)
treef66dc374d3ff53ff444e4975cfd40ec14916291c /tests/stdlib
parentfa06203e90d9bb9211d0b6b9726fc9f2c5dc80ad (diff)
downloadNim-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.nim70
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