summary refs log tree commit diff stats
path: root/tests/js
diff options
context:
space:
mode:
authorTimothee Cour <timothee.cour2@gmail.com>2020-06-06 11:15:24 -0700
committerGitHub <noreply@github.com>2020-06-06 20:15:24 +0200
commit61f2f1f5c5c563eefc8388c2b655ac816bcf676c (patch)
treed4cb88ecf8040f627a510a79b66cfe3460422f28 /tests/js
parent336f1e63d0186ab283fdb9868a8f7d8d05293a31 (diff)
downloadNim-61f2f1f5c5c563eefc8388c2b655ac816bcf676c.tar.gz
fix #14576 addr of param (including for lent) now works with nim js (#14577)
* fix #14576 addr(param) now works in nim js

* workaround https://github.com/nim-lang/Nim/issues/14578
Diffstat (limited to 'tests/js')
-rw-r--r--tests/js/taddr.nim62
1 files changed, 61 insertions, 1 deletions
diff --git a/tests/js/taddr.nim b/tests/js/taddr.nim
index d8ff4c11b..9c45621a8 100644
--- a/tests/js/taddr.nim
+++ b/tests/js/taddr.nim
@@ -1,5 +1,5 @@
 discard """
-  action: run
+  targets: "c js"
 """
 
 type T = object
@@ -77,3 +77,63 @@ let someGlobalPtr = getSomeGlobalPtr()
 doAssert(someGlobalPtr[] == 5)
 someGlobalPtr[] = 10
 doAssert(someGlobal == 10)
+
+block:
+  # issue #14576
+  # lots of these used to give: Error: internal error: genAddr: 2
+  proc byLent[T](a: T): lent T = a
+  proc byPtr[T](a: T): ptr T = a.unsafeAddr
+
+  block:
+    let a = (10,11)
+    let (x,y) = byLent(a)
+    doAssert (x,y) == a
+
+  block:
+    when defined(c) and defined(release):
+      # bug; pending https://github.com/nim-lang/Nim/issues/14578
+      discard
+    else:
+      let a = 10
+      doAssert byLent(a) == 10
+      let a2 = byLent(a)
+      doAssert a2 == 10
+
+  block:
+    let a = [11,12]
+    doAssert byLent(a) == [11,12]
+    let a2 = (11,)
+    doAssert byLent(a2) == (11,)
+
+  block:
+    when defined(c) and defined(release):
+      discard # probably not a bug since optimizer is free to pass by value, and `unsafeAddr` is used
+    else:
+      var a = @[12]
+      doAssert byPtr(a)[] == @[12]
+      let a2 = [13]
+      doAssert byPtr(a2)[] == [13]
+      let a3 = 14
+      doAssert byPtr(a3)[] == 14
+
+  block:
+    proc byLent2[T](a: seq[T]): lent T = a[1]
+    var a = @[20,21,22]
+    doAssert byLent2(a) == 21
+
+  block: # sanity checks
+    proc bar[T](a: var T): var T = a
+    var a = (10, 11)
+    let (k,v) = bar(a)
+    doAssert (k, v) == a
+    doAssert k == 10
+    bar(a)[0]+=100
+    doAssert a == (110, 11)
+    var a2 = 12
+    doAssert bar(a2) == a2
+    bar(a2).inc
+    doAssert a2 == 13
+
+  block: # xxx: bug this doesn't work
+    when false:
+      proc byLent2[T](a: T): lent type(a[0]) = a[0]