123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- discard """
- cmd: "nim c --gc:arc $file"
- output: '''
- hello
- hello
- @["a", "b"]
- ---------------------
- plain:
- destroying: ('first', 42)
- destroying: ('second', 20)
- destroying: ('third', 12)
- Option[T]:
- destroying: ('first', 42)
- destroying: ('second', 20)
- destroying: ('third', 12)
- seq[T]:
- destroying: ('first', 42)
- destroying: ('second', 20)
- destroying: ('third', 12)
- 1 1
- '''
- """
- import dmodule
- var val = parseMinValue()
- if val.kind == minDictionary:
- echo val
- #------------------------------------------------------------------------------
- # Issue #15238
- #------------------------------------------------------------------------------
- proc sinkArg(x: sink seq[string]) =
- discard
- proc varArg(lst: var seq[string]) =
- sinkArg(lst)
- var x = @["a", "b"]
- varArg(x)
- echo x
- #------------------------------------------------------------------------------
- # Issue #15286
- #------------------------------------------------------------------------------
- import std/os
- discard getFileInfo(".")
- #------------------------------------------------------------------------------
- # Issue #15707
- #------------------------------------------------------------------------------
- type
- JVMObject = ref object
- proc freeJVMObject(o: JVMObject) =
- discard
- proc fromJObject(T: typedesc[JVMObject]): T =
- result.new(cast[proc(r: T) {.nimcall.}](freeJVMObject))
- discard JVMObject.fromJObject()
- #------------------------------------------------------------------------------
- # Issue #15910
- #------------------------------------------------------------------------------
- import options
- type
- Thing = object
- name: string
- age: int
- proc `=destroy`(thing: var Thing) =
- if thing.name != "":
- echo "destroying: ('", thing.name, "', ", thing.age, ")"
- `=destroy`(thing.name)
- `=destroy`(thing.age)
- proc plain() =
- var t = Thing(name: "first", age: 42)
- t = Thing(name: "second", age: 20)
- t = Thing()
- let u = Thing(name: "third", age: 12)
- proc optionT() =
- var t = Thing(name: "first", age: 42).some
- t = Thing(name: "second", age: 20).some
- t = none(Thing)
- let u = Thing(name: "third", age: 12).some
- proc seqT() =
- var t = @[Thing(name: "first", age: 42)]
- t = @[Thing(name: "second", age: 20)]
- t = @[]
- let u = @[Thing(name: "third", age: 12)]
- echo "---------------------"
- echo "plain:"
- plain()
- echo()
- echo "Option[T]:"
- optionT()
- echo()
- echo "seq[T]:"
- seqT()
- echo()
- #------------------------------------------------------------------------------
- # Issue #16120, const seq into sink
- #------------------------------------------------------------------------------
- proc main =
- let avals = @[@[1.0'f32, 4.0, 7.0, 10.0]]
- let rankdef = avals
- echo avals.len, " ", rankdef.len
- main()
- #------------------------------------------------------------------------------
- # Issue #16722, ref on distinct type, wrong destructors called
- #------------------------------------------------------------------------------
- type
- Obj = object of RootObj
- ObjFinal = object
- ObjRef = ref Obj
- ObjFinalRef = ref ObjFinal
- D = distinct Obj
- DFinal = distinct ObjFinal
- DRef = ref D
- DFinalRef = ref DFinal
- proc `=destroy`(o: var Obj) =
- doAssert false, "no Obj is constructed in this sample"
- proc `=destroy`(o: var ObjFinal) =
- doAssert false, "no ObjFinal is constructed in this sample"
- var dDestroyed: int
- proc `=destroy`(d: var D) =
- dDestroyed.inc
- proc `=destroy`(d: var DFinal) =
- dDestroyed.inc
- func newD(): DRef =
- DRef ObjRef()
- func newDFinal(): DFinalRef =
- DFinalRef ObjFinalRef()
- proc testRefs() =
- discard newD()
- discard newDFinal()
- testRefs()
- doAssert(dDestroyed == 2)
- #------------------------------------------------------------------------------
- # Issue #16185, complex self-assingment elimination
- #------------------------------------------------------------------------------
- type
- CpuStorage*[T] = ref CpuStorageObj[T]
- CpuStorageObj[T] = object
- size*: int
- raw_buffer*: ptr UncheckedArray[T]
- Tensor[T] = object
- buf*: CpuStorage[T]
- TestObject = object
- x: Tensor[float]
- proc `=destroy`[T](s: var CpuStorageObj[T]) =
- if s.raw_buffer != nil:
- s.raw_buffer.deallocShared()
- s.size = 0
- s.raw_buffer = nil
- proc `=`[T](a: var CpuStorageObj[T]; b: CpuStorageObj[T]) {.error.}
- proc allocCpuStorage[T](s: var CpuStorage[T], size: int) =
- new(s)
- s.raw_buffer = cast[ptr UncheckedArray[T]](allocShared0(sizeof(T) * size))
- s.size = size
- proc newTensor[T](size: int): Tensor[T] =
- allocCpuStorage(result.buf, size)
- proc `[]`[T](t: Tensor[T], idx: int): T = t.buf.raw_buffer[idx]
- proc `[]=`[T](t: Tensor[T], idx: int, val: T) = t.buf.raw_buffer[idx] = val
- proc toTensor[T](s: seq[T]): Tensor[T] =
- result = newTensor[T](s.len)
- for i, x in s:
- result[i] = x
- proc main2() =
- var t: TestObject
- t.x = toTensor(@[1.0, 2, 3, 4])
- t.x = t.x
- doAssert(t.x.buf != nil) # self-assignment above should be eliminated
- main2()
|