summary refs log tree commit diff stats
path: root/tests/objvariant/treassign.nim
blob: 527204616c4190c2bee90a0d9329350e1437f8c0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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

{.cast(uncheckedAssign).}:
  passToVar(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