123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- discard """
- targets: "c cpp"
- matrix: "--mm:arc; --mm:orc"
- """
- block:
- type
- PublicKey = array[32, uint8]
- PrivateKey = array[64, uint8]
- proc ed25519_create_keypair(publicKey: ptr PublicKey; privateKey: ptr PrivateKey) =
- publicKey[][0] = uint8(88)
- type
- KeyPair = object
- public: PublicKey
- private: PrivateKey
- proc initKeyPair(): KeyPair =
- ed25519_create_keypair(result.public.addr, result.private.addr)
- let keys = initKeyPair()
- doAssert keys.public[0] == 88
- template minIndexByIt: untyped =
- var other = 3
- other
- proc bug20303() =
- var hlibs = @["hello", "world", "how", "are", "you"]
- let res = hlibs[minIndexByIt()]
- doAssert res == "are"
- bug20303()
- proc main() = # todo bug with templates
- block: # bug #11267
- var a: seq[char] = block: @[]
- doAssert a == @[]
- # 2
- proc b: seq[string] =
- discard
- @[]
- doAssert b() == @[]
- static: main()
- main()
- type Obj = tuple
- value: int
- arr: seq[int]
- proc bug(): seq[Obj] =
- result.add (value: 0, arr: @[])
- result[^1].value = 1
- result[^1].arr.add 1
- # bug #19990
- let s = bug()
- doAssert s[0] == (value: 1, arr: @[1])
- block: # bug #21974
- type Test[T] = ref object
- values : seq[T]
- counter: int
- proc newTest[T](): Test[T] =
- result = new(Test[T])
- result.values = newSeq[T](16)
- result.counter = 0
- proc push[T](self: Test[T], value: T) =
- self.counter += 1
- if self.counter >= self.values.len:
- self.values.setLen(self.values.len * 2)
- self.values[self.counter - 1] = value
- proc pop[T](self: Test[T]): T =
- result = self.values[0]
- self.values[0] = self.values[self.counter - 1] # <--- This line
- self.counter -= 1
- type X = tuple
- priority: int
- value : string
- var a = newTest[X]()
- a.push((1, "One"))
- doAssert a.pop.value == "One"
- # bug #21987
- type
- EmbeddedImage* = distinct Image
- Image = object
- len: int
- proc imageCopy*(image: Image): Image {.nodestroy.}
- proc `=destroy`*(x: Image) =
- discard
- proc `=sink`*(dest: var Image; source: Image) =
- `=destroy`(dest)
- wasMoved(dest)
- proc `=dup`*(source: Image): Image {.nodestroy.} =
- result = imageCopy(source)
- proc `=copy`*(dest: var Image; source: Image) =
- dest = imageCopy(source) # calls =sink implicitly
- proc `=destroy`*(x: EmbeddedImage) = discard
- proc `=dup`*(source: EmbeddedImage): EmbeddedImage {.nodestroy.} = source
- proc `=copy`*(dest: var EmbeddedImage; source: EmbeddedImage) {.nodestroy.} =
- dest = source
- proc imageCopy*(image: Image): Image =
- result = image
- proc main2 =
- block:
- var a = Image(len: 2).EmbeddedImage
- var b = Image(len: 1).EmbeddedImage
- b = a
- doAssert Image(a).len == 2
- doAssert Image(b).len == 2
- block:
- var a = Image(len: 2)
- var b = Image(len: 1)
- b = a
- doAssert a.len == 2
- doAssert b.len == 0
- main2()
- type
- Edge = object
- neighbor {.cursor.}: Node
- NodeObj = object
- neighbors: seq[Edge]
- label: string
- visited: bool
- Node = ref NodeObj
- Graph = object
- nodes: seq[Node]
- proc `=destroy`(x: NodeObj) =
- `=destroy`(x.neighbors)
- `=destroy`(x.label)
- proc addNode(self: var Graph; label: string): Node =
- self.nodes.add(Node(label: label))
- result = self.nodes[^1]
- proc addEdge(self: Graph; source, neighbor: Node) =
- source.neighbors.add(Edge(neighbor: neighbor))
- block:
- proc main =
- var graph: Graph
- let nodeA = graph.addNode("a")
- let nodeB = graph.addNode("b")
- let nodeC = graph.addNode("c")
- graph.addEdge(nodeA, neighbor = nodeB)
- graph.addEdge(nodeA, neighbor = nodeC)
- main()
- block:
- type RefObj = ref object
- proc `[]`(val: static[int]) = # works with different name/overload or without static arg
- discard
- template noRef(T: typedesc): typedesc = # works without template indirection
- typeof(default(T)[])
- proc `=destroy`(x: noRef(RefObj)) =
- discard
- proc foo =
- var x = new RefObj
- doAssert $(x[]) == "()"
- # bug #11705
- foo()
- block: # bug #22197
- type
- H5IdObj = object
- H5Id = ref H5IdObj
- FileID = distinct H5Id
- H5GroupObj = object
- file_id: FileID
- H5Group = ref H5GroupObj
- ## This would make it work!
- #proc `=destroy`*(x: FileID) = `=destroy`(cast[H5Id](x))
- ## If this does not exist, it also works!
- proc newFileID(): FileID = FileID(H5Id())
- proc `=destroy`(grp: H5GroupObj) =
- ## Closes the group and resets all references to nil.
- if cast[pointer](grp.fileId) != nil:
- `=destroy`(grp.file_id)
- var grp = H5Group()
- reset(grp.file_id)
- reset(grp)
- import std/tables
- block: # bug #22286
- type
- A = object
- B = object
- a: A
- C = object
- b: B
- proc `=destroy`(self: A) =
- echo "destroyed"
- proc `=destroy`(self: C) =
- `=destroy`(self.b)
- var c = C()
- block: # https://forum.nim-lang.org/t/10642
- type AObj = object
- name: string
- tableField: Table[string, string]
- proc `=destroy`(x: AObj) =
- `=destroy`(x.name)
- `=destroy`(x.tableField)
|