diff options
Diffstat (limited to 'tests/destructor/tdestructor.nim')
-rw-r--r-- | tests/destructor/tdestructor.nim | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/tests/destructor/tdestructor.nim b/tests/destructor/tdestructor.nim new file mode 100644 index 000000000..e081eb251 --- /dev/null +++ b/tests/destructor/tdestructor.nim @@ -0,0 +1,167 @@ +discard """ + output: '''----1 +myobj constructed +myobj destroyed +----2 +mygeneric1 constructed +mygeneric1 destroyed +----3 +mygeneric2 constructed +mygeneric2 destroyed +myobj destroyed +----4 +mygeneric3 constructed +mygeneric1 destroyed +----5 +mydistinctObj constructed +myobj destroyed +mygeneric2 destroyed +------------------8 +mygeneric1 destroyed +----6 +myobj destroyed +----7 +---9 +myobj destroyed +myobj destroyed +''' +""" + +type + TMyObj = object + x, y: int + p: pointer + +proc `=destroy`(o: var TMyObj) = + if o.p != nil: + dealloc o.p + o.p = nil + echo "myobj destroyed" + +type + TMyGeneric1[T] = object + x: T + + TMyGeneric2[A, B] = object + x: A + y: B + +proc `=destroy`(o: var TMyGeneric1[int]) = + echo "mygeneric1 destroyed" + +proc `=destroy`[A, B](o: var TMyGeneric2[A, B]) = + echo "mygeneric2 destroyed" + +type + TMyGeneric3[A, B, C] = object + x: A + y: B + z: C + + TDistinctObjX = distinct TMyGeneric3[TMyObj, TMyGeneric2[int, int], int] + TDistinctObj = TDistinctObjX + + TObjKind = enum Z, A, B, C, D + + TCaseObj = object + z: TMyGeneric3[TMyObj, float, int] + case kind: TObjKind + of Z: discard + of A: + x: TMyGeneric1[int] + of B, C: + y: TMyObj + else: + case innerKind: TObjKind + of Z: discard + of A, B, C: + p: TMyGeneric3[int, float, string] + of D: + q: TMyGeneric3[TMyObj, int, int] + r: string + +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() + + var b = TMyGeneric2[int, T](x: 10, y: val) + echo "mygeneric2 constructed" + + var c = TMyGeneric3[int, int, string](x: 10, y: 20, z: "test") + +proc mygeneric3 = + var x = TMyGeneric3[int, string, TMyGeneric1[int]]( + x: 10, y: "test", z: TMyGeneric1[int](x: 10)) + + echo "mygeneric3 constructed" + +proc mydistinctObj = + var x = TMyGeneric3[TMyObj, TMyGeneric2[int, int], int]( + x: open(), y: TMyGeneric2[int, int](x: 5, y: 15), z: 20) + + echo "mydistinctObj constructed" + +echo "----1" +myobj() + +echo "----2" +mygeneric1() + +echo "----3" +mygeneric2[int](10) + +echo "----4" +mygeneric3() + +echo "----5" +mydistinctObj() + +proc caseobj = + block: + var o1 = TCaseObj(kind: A, x: TMyGeneric1[int](x: 10)) + + block: + echo "----6" + var o2 = TCaseObj(kind: B, y: open()) + + block: + echo "----7" + var o3 = TCaseObj(kind: D, innerKind: B, r: "test", + p: TMyGeneric3[int, float, string](x: 10, y: 1.0, z: "test")) + + +echo "------------------8" +caseobj() + +proc caseobj_test_sink: TCaseObj = + # check that lifted sink can destroy case val correctly + result = TCaseObj(kind: D, innerKind: D, r: "test", + q: TMyGeneric3[TMyObj, int, int](x: open(), y: 1, z: 0)) + result = TCaseObj(kind: B, y: open()) + + +echo "---9" +discard caseobj_test_sink() + +# issue #14315 + +type Vector*[T] = object + x1: int + # x2: T # uncomment will remove error + +# proc `=destroy`*(x: var Vector[int]) = discard # this will remove error +proc `=destroy`*[T](x: var Vector[T]) = discard +var a: Vector[int] # Error: unresolved generic parameter |