taddr.nim 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. discard """
  2. action: run
  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)