* deprecate unsafeAddr; extend addr addr is now available for all addressable locations, unsafeAddr is deprecated and become an alias for addr * follow @Vindaar's advice * change the signature of addr * unsafeAddr => addr (stdlib) * Update changelog.md * unsafeAddr => addr (tests) * Revert "unsafeAddr => addr (stdlib)" This reverts commit ab83c99c507048a8396e636bf22d55fdd84d7d1c. * doc changes; thanks to @konsumlamm Co-authored-by: konsumlamm <44230978+konsumlamm@users.noreply.github.com> Co-authored-by: konsumlamm <44230978+konsumlamm@users.noreply.github.com>
48 lines
678 B
Nim
48 lines
678 B
Nim
discard """
|
|
output: '''
|
|
foo
|
|
C
|
|
3.14
|
|
foo
|
|
3.14
|
|
3.14
|
|
'''
|
|
"""
|
|
|
|
type
|
|
V = enum
|
|
A, B, C
|
|
X = object
|
|
f0: string
|
|
case f1: V
|
|
of A: f2: string
|
|
of B: discard
|
|
of C: f3: float
|
|
|
|
var obj = X(f0: "foo", f1: C, f3: 3.14)
|
|
|
|
block:
|
|
echo obj.f0
|
|
echo obj.f1
|
|
doAssertRaises(FieldDefect): echo obj.f2
|
|
echo obj.f3
|
|
|
|
block:
|
|
let a0 = addr(obj.f0)
|
|
echo a0[]
|
|
# let a1 = addr(obj.f1)
|
|
# echo a1[]
|
|
doAssertRaises(FieldDefect):
|
|
let a2 = addr(obj.f2)
|
|
echo a2[]
|
|
let a3 = addr(obj.f3)
|
|
echo a3[]
|
|
|
|
# Prevent double evaluation of LHS
|
|
block:
|
|
var flag = false
|
|
proc wrap(x: X): X =
|
|
doAssert flag == false
|
|
flag = true
|
|
result = x
|
|
echo wrap(obj).f3
|