Files
Nim/tests/objvariant/treassign.nim
Ryan McConnell 184d423779 fixes 25713; Allow addr of object variant's discriminant under uncheckedAssign (#25714)
#25713

```nim
type
  K = enum
    k1,k2
  Variant = object
    case kind: K
    of k1:
      discard
    of k2:
      discard

proc a(x: var K) = discard
proc b(x: ptr K) = discard

var x = Variant(kind: k1)
{.cast(uncheckedAssign).}:
  # must be within uncheckedAssign to work
  a(x.kind)
# doesn't work out of or under uncheckedAssign
b(addr x.kind)
```
2026-04-07 06:59:24 +02:00

60 lines
1.1 KiB
Nim

discard """
output: "SUCCESS"
"""
type
BasicNumber = object of RootObj
value: float32
RefChild* = ref object
curr*: TokenObject
Token* {.pure.} = enum
foo,
bar,
TokenObject = object
case kind*: Token
of Token.foo:
foo*: string
of Token.bar:
bar*: BasicNumber
var t = RefChild()
t.curr = TokenObject(kind: Token.bar, bar: BasicNumber(value: 12.34))
t.curr = TokenObject(kind: Token.foo, foo: "foo")
echo "SUCCESS"
proc passToVar(x: var Token) = discard
proc passToPtr(x: ptr Token) = discard
{.cast(uncheckedAssign).}:
passToVar(t.curr.kind)
passToPtr(addr t.curr.kind)
t.curr = TokenObject(kind: t.curr.kind, foo: "abc")
t.curr.kind = Token.foo
block:
type
TokenKind = enum
strLit, intLit
Token = object
case kind*: TokenKind
of strLit:
s*: string
of intLit:
i*: int64
var t = Token(kind: strLit, s: "abc")
{.cast(uncheckedAssign).}:
# inside the 'cast' section it is allowed to assign to the 't.kind' field directly:
t.kind = intLit
{.cast(uncheckedAssign).}:
t.kind = strLit