diff options
author | Timothee Cour <timothee.cour2@gmail.com> | 2020-06-06 11:15:24 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-06 20:15:24 +0200 |
commit | 61f2f1f5c5c563eefc8388c2b655ac816bcf676c (patch) | |
tree | d4cb88ecf8040f627a510a79b66cfe3460422f28 /tests/js | |
parent | 336f1e63d0186ab283fdb9868a8f7d8d05293a31 (diff) | |
download | Nim-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.nim | 62 |
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] |