taddr.nim 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. discard """
  2. targets: "c js"
  3. """
  4. type T = object
  5. x: int
  6. s: string
  7. var obj: T
  8. var fieldAddr = addr(obj.x)
  9. var objAddr = addr(obj)
  10. # Integer tests
  11. var field = fieldAddr[]
  12. doAssert field == 0
  13. var objDeref = objAddr[]
  14. doAssert objDeref.x == 0
  15. # Change value
  16. obj.x = 42
  17. doAssert field == 0
  18. doAssert objDeref.x == 0
  19. field = fieldAddr[]
  20. objDeref = objAddr[]
  21. doAssert field == 42
  22. doAssert objDeref.x == 42
  23. # String tests
  24. obj.s = "lorem ipsum dolor sit amet"
  25. var indexAddr = addr(obj.s[2])
  26. doAssert indexAddr[] == 'r'
  27. indexAddr[] = 'd'
  28. doAssert indexAddr[] == 'd'
  29. doAssert obj.s == "lodem ipsum dolor sit amet"
  30. # Bug #2148
  31. var x: array[2, int]
  32. var y = addr x[1]
  33. y[] = 12
  34. doAssert(x[1] == 12)
  35. type
  36. Foo = object
  37. bar: int
  38. var foo: array[2, Foo]
  39. var z = addr foo[1]
  40. z[].bar = 12345
  41. doAssert(foo[1].bar == 12345)
  42. var t : tuple[a, b: int]
  43. var pt = addr t[1]
  44. pt[] = 123
  45. doAssert(t.b == 123)
  46. #block: # Test "untyped" pointer.
  47. proc testPtr(p: pointer, a: int) =
  48. doAssert(a == 5)
  49. (cast[ptr int](p))[] = 124
  50. var i = 123
  51. testPtr(addr i, 5)
  52. doAssert(i == 124)
  53. var someGlobal = 5
  54. proc getSomeGlobalPtr(): ptr int = addr someGlobal
  55. let someGlobalPtr = getSomeGlobalPtr()
  56. doAssert(someGlobalPtr[] == 5)
  57. someGlobalPtr[] = 10
  58. doAssert(someGlobal == 10)
  59. block:
  60. # issue #14576
  61. # lots of these used to give: Error: internal error: genAddr: 2
  62. proc byLent[T](a: T): lent T = a
  63. proc byPtr[T](a: T): ptr T = a.unsafeAddr
  64. block:
  65. let a = (10,11)
  66. let (x,y) = byLent(a)
  67. doAssert (x,y) == a
  68. block:
  69. when defined(c) and defined(release):
  70. # bug; pending https://github.com/nim-lang/Nim/issues/14578
  71. discard
  72. else:
  73. let a = 10
  74. doAssert byLent(a) == 10
  75. let a2 = byLent(a)
  76. doAssert a2 == 10
  77. block:
  78. let a = [11,12]
  79. doAssert byLent(a) == [11,12]
  80. let a2 = (11,)
  81. doAssert byLent(a2) == (11,)
  82. block:
  83. when defined(c) and defined(release):
  84. discard # probably not a bug since optimizer is free to pass by value, and `unsafeAddr` is used
  85. else:
  86. var a = @[12]
  87. doAssert byPtr(a)[] == @[12]
  88. let a2 = [13]
  89. doAssert byPtr(a2)[] == [13]
  90. let a3 = 14
  91. doAssert byPtr(a3)[] == 14
  92. block:
  93. proc byLent2[T](a: seq[T]): lent T = a[1]
  94. var a = @[20,21,22]
  95. doAssert byLent2(a) == 21
  96. block: # sanity checks
  97. proc bar[T](a: var T): var T = a
  98. var a = (10, 11)
  99. let (k,v) = bar(a)
  100. doAssert (k, v) == a
  101. doAssert k == 10
  102. bar(a)[0]+=100
  103. doAssert a == (110, 11)
  104. var a2 = 12
  105. doAssert bar(a2) == a2
  106. bar(a2).inc
  107. doAssert a2 == 13
  108. block: # xxx: bug this doesn't work
  109. when false:
  110. proc byLent2[T](a: T): lent type(a[0]) = a[0]