summary refs log tree commit diff stats
path: root/lib/std/decls.nim
blob: dd7d19da7d5639cef03a8a5068a14e96fc3a8057 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# see `semLowerLetVarCustomPragma` for compiler support that enables these
# lowerings

template byaddr*(lhs, typ, ex) =
  ## Allows a syntax for lvalue reference, exact analog to
  ## `auto& a = ex;` in C++
  runnableExamples:
    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
  when typ is typeof(nil):
    let tmp = addr(ex)
  else:
    let tmp: ptr typ = addr(ex)
  template lhs: untyped = tmp[]