summary refs log tree commit diff stats
path: root/tests/destructor/tdestructor.nim
blob: bb1410d92d5d1fd627ea93f1078d06e2d649588f (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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
discard """
  output: '''----
myobj constructed
myobj destroyed
----
mygeneric1 constructed
mygeneric1 destroyed
----
mygeneric2 constructed
mygeneric2 destroyed
myobj destroyed
----
mygeneric3 constructed
mygeneric1 destroyed
'''
"""

type
  TMyObj = object
    x, y: int
    p: pointer

  TMyGeneric1[T] = object
    x: T

  TMyGeneric2[A, B] = object
    x: A
    y: B

  TMyGeneric3[A, B, C] = object
    x: A
    y: B
    z: C

proc destruct(o: var TMyObj) {.destructor.} =
  if o.p != nil: dealloc o.p
  echo "myobj destroyed"

proc destroy(o: var TMyGeneric1) {.destructor.} =
  echo "mygeneric1 destroyed"

proc destroy[A, B](o: var TMyGeneric2[A, B]) {.destructor.} =
  echo "mygeneric2 destroyed"

proc open: TMyObj =
  # allow for superfluous ()
  result = (TMyObj(x: 1, y: 2, p: alloc(3)))

proc `$`(x: TMyObj): string = $x.y

proc myobj() =
  var x = open()
  echo "myobj constructed"

proc mygeneric1() =
  var x = TMyGeneric1[int](x: 10)
  echo "mygeneric1 constructed"

proc mygeneric2[T](val: T) =
  var
    a = open()
    b = TMyGeneric2[int, T](x: 10, y: val)
    c = TMyGeneric3[int, int, string](x: 10, y: 20, z: "test")

  echo "mygeneric2 constructed"

proc mygeneric3 =
  var x = TMyGeneric3[int, string, TMyGeneric1[int]](
    x: 10, y: "test", z: TMyGeneric1[int](x: 10))

  echo "mygeneric3 constructed"

echo "----"
myobj()

echo "----"
mygeneric1()

echo "----"
mygeneric2[int](10)

echo "----"
mygeneric3()