diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/destructor/tdestructor3.nim | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/tests/destructor/tdestructor3.nim b/tests/destructor/tdestructor3.nim index a1de284ae..4c251e0bf 100644 --- a/tests/destructor/tdestructor3.nim +++ b/tests/destructor/tdestructor3.nim @@ -5,7 +5,9 @@ destroy 5 123 destroy Foo: 123 -destroy Foo: 5''' +destroy Foo: 5 +(x1: (val: ...)) +destroy''' joinable: false """ @@ -49,3 +51,45 @@ proc main = test(toFooPtr(123)) main() + +# bug #11517 +type + UniquePtr*[T] = object + val: ptr T + +proc `=destroy`*[T](p: var UniquePtr[T]) = + mixin `=destroy` + echo "destroy" + if p.val != nil: + `=destroy`(p.val[]) + dealloc(p.val) + p.val = nil + +proc `=`*[T](dest: var UniquePtr[T], src: UniquePtr[T]) {.error.} + +proc `=sink`*[T](dest: var UniquePtr[T], src: UniquePtr[T]) {.inline.} = + if dest.val != src.val: + if dest.val != nil: + `=destroy`(dest) + dest.val = src.val + +proc newUniquePtr*[T](val: sink T): UniquePtr[T] = + result.val = create(T) + result.val[] = val + +#------------------------------------------------------------- + +type + MyObject = object of RootObj + x1: UniquePtr[int] + + MyObject2 = object of MyObject + +proc newObj2(x:int, y: float): MyObject2 = + MyObject2(x1: newUniquePtr(x)) + +proc test = + let obj2 = newObj2(1, 1.0) + echo obj2 + +test() |