Files
Nim/tests/arc/t14383.nim
Clyybber ccb11a63fb Reboot of #16195 (#16746)
* fix #16185

* fix test

* fix comment

* fix comment

* better approach

* Add more tests and move sameLocation to injectdestructors

* Better and more strict sameLocation

* Small cleanup and preliminary spec clarification

* Fix

* Fix doc

* Expand test

Co-authored-by: Andrey R (cooldome) <ariabushenko@gmail.com>
2021-01-20 11:05:56 +01:00

218 lines
4.8 KiB
Nim

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()