123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438 |
- # bug #4462
- import macros
- import os
- block:
- proc foo(t: typedesc) {.compileTime.} =
- assert sameType(getType(t), getType(int))
- static:
- foo(int)
- # #4412
- block:
- proc default[T](t: typedesc[T]): T {.inline.} = discard
- static:
- var x = default(type(0))
- # #6379
- import algorithm
- static:
- var numArray = [1, 2, 3, 4, -1]
- numArray.sort(cmp)
- assert numArray == [-1, 1, 2, 3, 4]
- var str = "cba"
- str.sort(cmp)
- assert str == "abc"
- # #6086
- import math, sequtils, sugar
- block:
- proc f: int =
- toSeq(10..<10_000).filter(
- a => a == ($a).map(
- d => (d.ord-'0'.ord).int^4
- ).sum
- ).sum
- var a = f()
- const b = f()
- assert a == b
- block:
- proc f(): seq[char] =
- result = "hello".map(proc(x: char): char = x)
- var runTime = f()
- const compTime = f()
- assert runTime == compTime
- # #6083
- block:
- proc abc(): seq[int] =
- result = @[0]
- result.setLen(2)
- var tmp: int
- for i in 0 ..< 2:
- inc tmp
- result[i] = tmp
- const fact1000 = abc()
- assert fact1000 == @[1, 2]
- # Tests for VM ops
- block:
- static:
- # for joint test, the project path is different, so I disabled it:
- when false:
- assert "vm" in getProjectPath()
- let b = getEnv("UNSETENVVAR")
- assert b == ""
- assert existsEnv("UNSERENVVAR") == false
- putEnv("UNSETENVVAR", "VALUE")
- assert getEnv("UNSETENVVAR") == "VALUE"
- assert existsEnv("UNSETENVVAR") == true
- assert fileExists("MISSINGFILE") == false
- assert dirExists("MISSINGDIR") == false
- # #7210
- block:
- static:
- proc f(size: int): int =
- var some = newStringOfCap(size)
- result = size
- doAssert f(4) == 4
- # #6689
- block:
- static:
- proc foo(): int = 0
- var f: proc(): int
- doAssert f.isNil
- f = foo
- doAssert(not f.isNil)
- block:
- static:
- var x: ref ref int
- new(x)
- doAssert(not x.isNil)
- # #7871
- static:
- type Obj = object
- field: int
- var s = newSeq[Obj](1)
- var o = Obj()
- s[0] = o
- o.field = 2
- doAssert s[0].field == 0
- # #8125
- static:
- let def_iter_var = ident("it")
- # #8142
- static:
- type Obj = object
- names: string
- proc pushName(o: var Obj) =
- var s = ""
- s.add("FOOBAR")
- o.names.add(s)
- var o = Obj()
- o.names = ""
- o.pushName()
- o.pushName()
- doAssert o.names == "FOOBARFOOBAR"
- # #8154
- import parseutils
- static:
- type Obj = object
- i: int
- proc foo(): Obj =
- discard parseInt("1", result.i, 0)
- static:
- doAssert foo().i == 1
- # #10333
- block:
- const
- encoding: auto = [
- ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"],
- ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"],
- ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"],
- ["", "M", "MM", "MMM", "--", "-", "--", "---", "----", "--"],
- ]
- doAssert encoding.len == 4
- # #10886
- proc tor(): bool =
- result = true
- result = false or result
- proc tand(): bool =
- result = false
- result = true and result
- const
- ctor = tor()
- ctand = not tand()
- static:
- doAssert ctor
- doAssert ctand
- block: # bug #13081
- type Kind = enum
- k0, k1, k2, k3
- type Foo = object
- x0: float
- case kind: Kind
- of k0: discard
- of k1: x1: int
- of k2: x2: string
- of k3: x3: string
- const j1 = Foo(x0: 1.2, kind: k1, x1: 12)
- const j2 = Foo(x0: 1.3, kind: k2, x2: "abc")
- const j3 = Foo(x0: 1.3, kind: k3, x3: "abc2")
- static:
- doAssert $j1 == "(x0: 1.2, kind: k1, x1: 12)"
- doAssert $j2 == """(x0: 1.3, kind: k2, x2: "abc")"""
- doAssert $j3 == """(x0: 1.3, kind: k3, x3: "abc2")"""
- doAssert $j1 == "(x0: 1.2, kind: k1, x1: 12)"
- doAssert $j2 == """(x0: 1.3, kind: k2, x2: "abc")"""
- doAssert $j3 == """(x0: 1.3, kind: k3, x3: "abc2")"""
- doAssert j1.x1 == 12
- static:
- doAssert j1.x1 == 12
- block: # bug #15595
- proc fn0()=echo 0
- proc fn1()=discard
- proc main=
- var local = 0
- proc fn2()=echo local
- var a0 = fn0
- var a1 = fn1
- var a2 = fn2
- var a3: proc()
- var a4: proc()
- doAssert a0 == fn0 # bugfix
- doAssert a1 == fn1 # ditto
- doAssert a2 == fn2 # ditto
- doAssert fn0 != fn1
- doAssert a2 != nil
- doAssert a3 == nil # bugfix
- doAssert a3 == a4 # bugfix
- static: main()
- main()
- # bug #15363
- import sequtils
- block:
- func identity(a: bool): bool = a
- var a: seq[bool] = static:
- newSeq[bool](0).mapIt(it) # segfaults
- var b: seq[bool] = static:
- newSeq[bool](0).filterIt(it) # does not segfault
- var c: seq[bool] = static:
- newSeq[bool](0).map(identity) # does not segfault
- var d: seq[bool] = static:
- newSeq[bool](0).map(proc (a: bool): bool = false) # segfaults
- var e: seq[bool] = static:
- newSeq[bool](0).filter(identity) # does not segfault
- var f: seq[bool] = static:
- newSeq[bool](0).filter(proc (a: bool): bool = false) # segfaults
- doAssert a == @[]
- doAssert b == @[]
- doAssert c == @[]
- doAssert d == @[]
- doAssert e == @[]
- doAssert f == @[]
- import tables
- block: # bug #8007
- type
- CostKind = enum
- Fixed,
- Dynamic
- Cost = object
- case kind*: CostKind
- of Fixed:
- cost*: int
- of Dynamic:
- handler*: proc(value: int): int {.nimcall.}
- proc foo(value: int): int {.nimcall.} =
- sizeof(value)
- const a: array[2, Cost] =[
- Cost(kind: Fixed, cost: 999),
- Cost(kind: Dynamic, handler: foo)
- ]
- # OK with arrays & object variants
- doAssert $a == "[(kind: Fixed, cost: 999), (kind: Dynamic, handler: ...)]"
- const b: Table[int, Cost] = {
- 0: Cost(kind: Fixed, cost: 999),
- 1: Cost(kind: Dynamic, handler: foo)
- }.toTable
- # KO with Tables & object variants
- # echo b # {0: (kind: Fixed, cost: 0), 1: (kind: Dynamic, handler: ...)} # <----- wrong behaviour
- doAssert $b == "{0: (kind: Fixed, cost: 999), 1: (kind: Dynamic, handler: ...)}"
- const c: Table[int, int] = {
- 0: 100,
- 1: 999
- }.toTable
- # OK with Tables and primitive int
- doAssert $c == "{0: 100, 1: 999}"
- # For some reason the following gives
- # Error: invalid type for const: Cost
- const d0 = Cost(kind: Fixed, cost: 999)
- # OK with seq & object variants
- const d = @[Cost(kind: Fixed, cost: 999), Cost(kind: Dynamic, handler: foo)]
- doAssert $d == "@[(kind: Fixed, cost: 999), (kind: Dynamic, handler: ...)]"
- block: # VM wrong register free causes errors in unrelated code
- block: # bug #15597
- #[
- Error: unhandled exception: 'sym' is not accessible using discriminant 'kind' of type 'TNode' [FieldDefect]
- in /Users/timothee/git_clone/nim/Nim_prs/compiler/vm.nim(1176) rawExecute
- in opcIndCall
- in let prc = if not isClosure: bb.sym else: bb[0].sym
- ]#
- proc bar2(head: string): string = "asdf"
- proc gook(u1: int) = discard
- type PathEntry = object
- kind: int
- path: string
- iterator globOpt(): int =
- var u1: int
- gook(u1)
- gook(u1)
- gook(u1)
- gook(u1)
- gook(u1)
- gook(u1)
- gook(u1)
- gook(u1)
- gook(u1)
- gook(u1)
- gook(u1)
- gook(u1)
- gook(u1)
- gook(u1)
- var entry = PathEntry()
- entry.path = bar2("")
- if false:
- echo "here2"
- proc processAux(a: float) = discard
- template bar(iter: untyped): untyped =
- var ret: float
- for x in iter: break
- ret
- proc main() =
- processAux(bar(globOpt()))
- static: main()
- block: # ditto
- # D20201024T133245
- type Deque = object
- proc initDeque2(initialSize: int = 4): Deque = Deque()
- proc len2(a: Deque): int = 2
- proc baz(dir: string): bool = true
- proc bar2(head: string): string = "asdf"
- proc bar3(path: var string) = path = path
- type PathEntry = object
- kind: int
- path: string
- proc initGlobOpt(dir: string, a1=false,a2=false,a3=false,a4=false): string = dir
- iterator globOpt(dir: string): int =
- var stack = initDeque2()
- doAssert baz("")
- let z = stack.len2
- if stack.len2 >= 0:
- var entry = PathEntry()
- let current = if true: stack.len2 else: stack.len2
- entry.path = bar2("")
- bar3(entry.path)
- if false:
- echo "here2" # comment here => you get same error as https://github.com/nim-lang/Nim/issues/15704
- proc processAux(a: float) = discard
- template bar(iter: untyped): untyped =
- var ret: float
- for x in iter: break
- ret
- proc main() =
- processAux(bar(globOpt(initGlobOpt("."))))
- static: main()
- block: # bug #15704
- #[
- Error: attempt to access a nil address kind: rkFloat
- ]#
- type Deque = object
- proc initDeque2(initialSize: int = 4): Deque = Deque()
- proc len2(a: Deque): int = 2
- proc baz(dir: string): bool = true
- proc bar2(head: string): string = "asdf"
- proc bar3(path: var string) = path = path
- type PathEntry = object
- kind: int
- path: string
- depth: int
- proc initGlobOpt(dir: string, a1=false,a2=false,a3=false,a4=false): string =
- dir
- iterator globOpt(dir: string): int =
- var stack = initDeque2()
- doAssert baz("")
- let z = stack.len2
- var a5: int
- if stack.len2 >= 0:
- var entry = PathEntry()
- if false:
- echo "here"
- let current = if true: stack.len2 else: stack.len2
- entry.depth = 1
- entry.path = bar2("")
- bar3(entry.path)
- proc processAux(a: float) = discard
- template bar(iter: untyped): untyped =
- var ret: float
- for x in iter:
- break
- ret
- const dir = "."
- proc main() =
- processAux(bar(globOpt(initGlobOpt(dir))))
- static: main()
|