diff options
Diffstat (limited to 'tests/notnil')
-rw-r--r-- | tests/notnil/tmust_compile.nim | 75 | ||||
-rw-r--r-- | tests/notnil/tnotnil.nim | 16 | ||||
-rw-r--r-- | tests/notnil/tnotnil1.nim | 19 | ||||
-rw-r--r-- | tests/notnil/tnotnil2.nim | 4 | ||||
-rw-r--r-- | tests/notnil/tnotnil3.nim | 2 | ||||
-rw-r--r-- | tests/notnil/tnotnil4.nim | 7 | ||||
-rw-r--r-- | tests/notnil/tnotnil5.nim | 28 | ||||
-rw-r--r-- | tests/notnil/tnotnil_in_generic.nim | 1 | ||||
-rw-r--r-- | tests/notnil/tnotnil_in_objconstr.nim | 20 | ||||
-rw-r--r-- | tests/notnil/tparse.nim | 18 |
10 files changed, 148 insertions, 42 deletions
diff --git a/tests/notnil/tmust_compile.nim b/tests/notnil/tmust_compile.nim new file mode 100644 index 000000000..3a013e9ed --- /dev/null +++ b/tests/notnil/tmust_compile.nim @@ -0,0 +1,75 @@ +discard """ + output: '''success''' +""" + +# bug #6682 +{.experimental: "notnil".} + +type + Fields = enum + A=1, B, C + + Obj = object + fld: array[Fields, int] + + AsGeneric[T] = array[Fields, T] + Obj2[T] = object + fld: AsGeneric[T] + +var a: Obj # this works + +var arr: array[Fields, int] + +var b = Obj() # this doesn't (also doesn't works with additional fields) + +var z = Obj2[int]() + +echo "success" + +# bug #6555 + +import tables + +type + TaskOrNil = ref object + Task = TaskOrNil not nil + +let table = newTable[string, Task]() +table.del("task") + +# bug #6121 + +import json + +type + + foo = object + thing: ptr int not nil + + CTS = ref object + subs_by_sid: Table[int, foo] + + +proc parse(cts: CTS, jn: JsonNode) = + var y = jn.getInt(4523) + let ces = foo( + thing: addr y + ) + + cts.subs_by_sid[0] = ces + + +# bug #6489 + +proc p(x: proc(){.closure.} not nil) = discard +p(proc(){.closure.} = discard) + +# bug #6490 + +proc p2(a: proc()) = + if a.isNil: + raise newException(ValueError, "a is nil") + else: + let b: proc() not nil = a + +p2(writeStackTrace) diff --git a/tests/notnil/tnotnil.nim b/tests/notnil/tnotnil.nim index f65634ed6..c33b6fcac 100644 --- a/tests/notnil/tnotnil.nim +++ b/tests/notnil/tnotnil.nim @@ -1,23 +1,13 @@ discard """ - line: 22 errormsg: "type mismatch" + line: 13 """ - +{.experimental: "notnil".} type PObj = ref TObj not nil TObj = object x: int - MyString = string not nil - -#var x: PObj = nil - -proc p(x: string not nil): int = - result = 45 - -proc q(x: MyString) = nil -proc q2(x: string) = nil +proc q2(x: string) = discard q2(nil) -q(nil) - diff --git a/tests/notnil/tnotnil1.nim b/tests/notnil/tnotnil1.nim index 73472752c..60666d64d 100644 --- a/tests/notnil/tnotnil1.nim +++ b/tests/notnil/tnotnil1.nim @@ -1,30 +1,17 @@ discard """ errormsg: "'y' is provably nil" - line:38 + line:25 """ import strutils - +{.experimental: "notnil".} type TObj = object x, y: int -type - superstring = string not nil - - -proc q(s: superstring) = - echo s - -proc p2() = - var a: string = "I am not nil" - q(a) # but this should and does not - -p2() - proc q(x: pointer not nil) = - nil + discard proc p() = var x: pointer diff --git a/tests/notnil/tnotnil2.nim b/tests/notnil/tnotnil2.nim index bd6b8b675..6cd08de73 100644 --- a/tests/notnil/tnotnil2.nim +++ b/tests/notnil/tnotnil2.nim @@ -4,14 +4,14 @@ discard """ """ import strutils - +{.experimental: "notnil".} type TObj = object x, y: int proc q(x: pointer not nil) = - nil + discard proc p() = var x: pointer diff --git a/tests/notnil/tnotnil3.nim b/tests/notnil/tnotnil3.nim index b7c7a811d..31a4efef7 100644 --- a/tests/notnil/tnotnil3.nim +++ b/tests/notnil/tnotnil3.nim @@ -5,7 +5,7 @@ discard """ # bug #584 # Testprogram for 'not nil' check - +{.experimental: "notnil".} const testWithResult = true type diff --git a/tests/notnil/tnotnil4.nim b/tests/notnil/tnotnil4.nim index 2fa888357..c5178f71b 100644 --- a/tests/notnil/tnotnil4.nim +++ b/tests/notnil/tnotnil4.nim @@ -2,14 +2,17 @@ discard "" type TObj = ref object +{.experimental: "notnil".} + proc check(a: TObj not nil) = echo repr(a) proc doit() = var x : array[0..1, TObj] - if x[0] != nil: - check(x[0]) + let y = x[0] + if y != nil: + check(y) doit() diff --git a/tests/notnil/tnotnil5.nim b/tests/notnil/tnotnil5.nim new file mode 100644 index 000000000..2dcb7f7c3 --- /dev/null +++ b/tests/notnil/tnotnil5.nim @@ -0,0 +1,28 @@ +discard """ + matrix: "--threads:on" +""" + +{.experimental: "parallel".} +{.experimental: "notnil".} +import threadpool + +type + AO = object + x: int + + A = ref AO not nil + +proc process(a: A): A = + return A(x: a.x+1) + +proc processMany(ayys: openArray[A]): seq[A] = + var newAs: seq[FlowVar[A]] + + parallel: + for a in ayys: + newAs.add(spawn process(a)) + for newAflow in newAs: + let newA = ^newAflow + if isNil(newA): + return @[] + result.add(newA) diff --git a/tests/notnil/tnotnil_in_generic.nim b/tests/notnil/tnotnil_in_generic.nim index 357ab2c7c..89d20f182 100644 --- a/tests/notnil/tnotnil_in_generic.nim +++ b/tests/notnil/tnotnil_in_generic.nim @@ -3,6 +3,7 @@ discard """ """ # bug #2216 +{.experimental: "notnil".} type A[T] = ref object diff --git a/tests/notnil/tnotnil_in_objconstr.nim b/tests/notnil/tnotnil_in_objconstr.nim index 2110bda8f..471150f44 100644 --- a/tests/notnil/tnotnil_in_objconstr.nim +++ b/tests/notnil/tnotnil_in_objconstr.nim @@ -1,14 +1,18 @@ discard """ - errormsg: "field not initialized: bar" - line: "13" + errormsg: "The Foo type requires the following fields to be initialized: bar, baz" + line: "17" """ - +{.experimental: "notnil".} # bug #2355 type - Foo = object - foo: string not nil - bar: string not nil + Base = object of RootObj + baz: ref int not nil + + Foo = object of Base + foo: ref int + bar: ref int not nil -# Create instance without initializaing the `bar` field -var f = Foo(foo: "foo") +var x: ref int = new(int) +# Create instance without initializing the `bar` field +var f = Foo(foo: x) echo f.bar.isNil # true diff --git a/tests/notnil/tparse.nim b/tests/notnil/tparse.nim new file mode 100644 index 000000000..5c938ff04 --- /dev/null +++ b/tests/notnil/tparse.nim @@ -0,0 +1,18 @@ +# issue #16324 + +{.push experimental: "notnil".} + +block: + type Foo = ref object + value: int + + proc newFoo1(): Foo not nil = # This compiles + return Foo(value: 1) + + proc newFoo2(): Foo not nil {.inline.} = # This does not + return Foo(value: 1) + + doAssert newFoo1().value == 1 + doAssert newFoo2().value == 1 + +{.pop.} |