mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-30 18:02:05 +00:00
* 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>
218 lines
4.8 KiB
Nim
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()
|