123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- discard """
- output: '''
- assign
- destroy
- destroy
- 5
- 123
- destroy Foo: 123
- destroy Foo: 5
- (x1: (val: ...))
- destroy
- ---------------
- app begin
- (val: ...)
- destroy
- app end
- '''
- joinable: false
- """
- # bug #2821
- type T = object
- proc `=`(lhs: var T, rhs: T) =
- echo "assign"
- proc `=destroy`(v: var T) =
- echo "destroy"
- proc use(x: T) = discard
- proc usedToBeBlock =
- var v1 = T()
- var v2: T = v1
- discard addr(v2) # prevent cursorfication
- use v1
- usedToBeBlock()
- # bug #1632
- type
- Foo = object of RootObj
- x: int
- proc `=destroy`(a: var Foo) =
- echo "destroy Foo: " & $a.x
- template toFooPtr(a: int{lit}): ptr Foo =
- var temp = Foo(x:a)
- temp.addr
- proc test(a: ptr Foo) =
- echo a[].x
- proc main =
- test(toFooPtr(5))
- 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()
- #------------------------------------------------------------
- # Issue #12883
- type
- TopObject = object
- internal: UniquePtr[int]
- proc deleteTop(p: ptr TopObject) =
- if p != nil:
- `=destroy`(p[]) # !!! this operation used to leak the integer
- deallocshared(p)
- proc createTop(): ptr TopObject =
- result = cast[ptr TopObject](allocShared0(sizeof(TopObject)))
- result.internal = newUniquePtr(1)
- proc test2() =
- let x = createTop()
- echo $x.internal
- deleteTop(x)
- echo "---------------"
- echo "app begin"
- test2()
- echo "app end"
- # bug #14601
- when true: # D20200607T202043
- type Foo2 = object
- x: int
- x2: array[10, int]
- type Vec = object
- vals: seq[Foo2]
- proc `=destroy`*(a: var Foo2) {.inline.} =
- discard
- proc initFoo2(x: int): Foo2 = Foo2(x: x)
- proc add2(v: var Vec, a: Foo2) = # ditto with `a: sink Foo2`
- v.vals.add a
- proc add3(v: var Vec, a: Foo2) = # ditto with `a: sink Foo2`
- v.vals = @[a]
- proc add4(v: var Vec, a: sink Foo2) = # ditto with `a: sink Foo2`
- v.vals.add a
- proc add5(v: var Vec, a: sink Foo2) = # ditto with `a: sink Foo2`
- v.vals = @[a]
- proc main2()=
- var a: Vec
- var b = Foo2(x: 10)
- a.add2 b # ok
- a.vals.add Foo2(x: 10) # ok
- a.add2 initFoo2(x = 10) # ok
- a.add2 Foo2(x: 10) # bug
- a.add3 initFoo2(x = 10) # ok
- a.add3 Foo2(x: 10) # bug
- a.add4 initFoo2(x = 10) # ok
- a.add4 Foo2(x: 10) # bug
- a.add5 initFoo2(x = 10) # ok
- a.add5 Foo2(x: 10) # bug
- main2()
- #------------------------------------------------------------
- # Issue #15825
- type
- Union = string | int | char
- proc run(a: sink Union) =
- discard
- run("123")
|