diff options
Diffstat (limited to 'tests/array')
-rw-r--r-- | tests/array/t15117.nim | 27 | ||||
-rw-r--r-- | tests/array/t20248.nim | 14 | ||||
-rw-r--r-- | tests/array/t7818.nim | 132 | ||||
-rw-r--r-- | tests/array/t9932.nim | 11 | ||||
-rw-r--r-- | tests/array/tarray.nim | 651 | ||||
-rw-r--r-- | tests/array/tarray2.nim | 36 | ||||
-rw-r--r-- | tests/array/tarray3.nim | 13 | ||||
-rw-r--r-- | tests/array/tarraycons.nim | 5 | ||||
-rw-r--r-- | tests/array/tarraycons2.nim | 23 | ||||
-rw-r--r-- | tests/array/tarraycons_ptr_generic.nim | 51 | ||||
-rw-r--r-- | tests/array/tarraycons_ptr_generic2.nim | 2 | ||||
-rw-r--r-- | tests/array/tarraylen.nim | 18 | ||||
-rw-r--r-- | tests/array/tarrindx.nim | 31 | ||||
-rw-r--r-- | tests/array/tidx_lit_err1.nim | 6 | ||||
-rw-r--r-- | tests/array/tidx_lit_err2.nim | 5 | ||||
-rw-r--r-- | tests/array/tidx_lit_err3.nim | 5 | ||||
-rw-r--r-- | tests/array/tinvalidarrayaccess.nim | 21 | ||||
-rw-r--r-- | tests/array/tinvalidarrayaccess2.nim | 10 | ||||
-rw-r--r-- | tests/array/tlargeindex.nim | 18 | ||||
-rw-r--r-- | tests/array/troof1.nim | 43 | ||||
-rw-r--r-- | tests/array/troof3.nim | 7 | ||||
-rw-r--r-- | tests/array/troofregression.nim | 46 | ||||
-rw-r--r-- | tests/array/troofregression2.nim | 102 | ||||
-rw-r--r-- | tests/array/tunchecked.nim | 5 |
24 files changed, 722 insertions, 560 deletions
diff --git a/tests/array/t15117.nim b/tests/array/t15117.nim new file mode 100644 index 000000000..157b04bee --- /dev/null +++ b/tests/array/t15117.nim @@ -0,0 +1,27 @@ +discard """ + matrix: "--cc:vcc" + disabled: "linux" + disabled: "bsd" + disabled: "osx" + disabled: "unix" + disabled: "posix" +""" +{.experimental: "views".} + +let a: array[0, byte] = [] +discard a + +type B = object + a:int +let b: array[0, B] = [] +let c: array[0, ptr B] = [] +let d: array[0, ref B] = [] +discard b +discard c +discard d + +discard default(array[0, B]) + +type + View1 = openArray[byte] +discard default(View1) diff --git a/tests/array/t20248.nim b/tests/array/t20248.nim new file mode 100644 index 000000000..66142548b --- /dev/null +++ b/tests/array/t20248.nim @@ -0,0 +1,14 @@ +discard """ +cmd: "nim check --hints:off $file" +errormsg: "ordinal type expected; given: Error Type" +nimout: ''' +t20248.nim(10, 36) Error: ordinal type expected; given: Error Type +t20248.nim(14, 20) Error: ordinal type expected; given: Error Type +''' +""" + +type Vec[N: static[int]] = array[0 ..< N, float] + +var v: Vec[32] + +var stuff: array[0 ..< 16, int] diff --git a/tests/array/t7818.nim b/tests/array/t7818.nim deleted file mode 100644 index 4e43bff85..000000000 --- a/tests/array/t7818.nim +++ /dev/null @@ -1,132 +0,0 @@ -discard """ - output: "OK" -""" - -# bug #7818 -# this is not a macro bug, but array construction bug -# I use macro to avoid object slicing -# see #7712 and #7637 -import macros - -type - Vehicle[T] = object of RootObj - tire: T - Car[T] = object of Vehicle[T] - Bike[T] = object of Vehicle[T] - -macro peek(n: typed): untyped = - let val = getTypeImpl(n).treeRepr - newLit(val) - -block test_t7818: - var v = Vehicle[int](tire: 3) - var c = Car[int](tire: 4) - var b = Bike[int](tire: 2) - - let y = peek([c, b, v]) - let z = peek([v, c, b]) - doAssert(y == z) - -block test_t7906_1: - proc init(x: typedesc, y: int): ref x = - result = new(ref x) - result.tire = y - - var v = init(Vehicle[int], 3) - var c = init(Car[int], 4) - var b = init(Bike[int], 2) - - let y = peek([c, b, v]) - let z = peek([v, c, b]) - doAssert(y == z) - -block test_t7906_2: - var v = Vehicle[int](tire: 3) - var c = Car[int](tire: 4) - var b = Bike[int](tire: 2) - - let y = peek([c.addr, b.addr, v.addr]) - let z = peek([v.addr, c.addr, b.addr]) - doAssert(y == z) - -block test_t7906_3: - type - Animal[T] = object of RootObj - hair: T - Mammal[T] = object of Animal[T] - Monkey[T] = object of Mammal[T] - - var v = Animal[int](hair: 3) - var c = Mammal[int](hair: 4) - var b = Monkey[int](hair: 2) - - let z = peek([c.addr, b.addr, v.addr]) - let y = peek([v.addr, c.addr, b.addr]) - doAssert(y == z) - -type - Fruit[T] = ref object of RootObj - color: T - Apple[T] = ref object of Fruit[T] - Banana[T] = ref object of Fruit[T] - -proc testArray[T](x: array[3, Fruit[T]]): string = - result = "" - for c in x: - result.add $c.color - -proc testOpenArray[T](x: openArray[Fruit[T]]): string = - result = "" - for c in x: - result.add $c.color - -block test_t7906_4: - var v = Fruit[int](color: 3) - var c = Apple[int](color: 4) - var b = Banana[int](color: 2) - - let y = peek([c, b, v]) - let z = peek([v, c, b]) - doAssert(y == z) - -block test_t7906_5: - var a = Fruit[int](color: 1) - var b = Apple[int](color: 2) - var c = Banana[int](color: 3) - - doAssert(testArray([a, b, c]) == "123") - doAssert(testArray([b, c, a]) == "231") - - doAssert(testOpenArray([a, b, c]) == "123") - doAssert(testOpenArray([b, c, a]) == "231") - - doAssert(testOpenArray(@[a, b, c]) == "123") - doAssert(testOpenArray(@[b, c, a]) == "231") - -proc testArray[T](x: array[3, ptr Vehicle[T]]): string = - result = "" - for c in x: - result.add $c.tire - -proc testOpenArray[T](x: openArray[ptr Vehicle[T]]): string = - result = "" - for c in x: - result.add $c.tire - -block test_t7906_6: - var u = Vehicle[int](tire: 1) - var v = Bike[int](tire: 2) - var w = Car[int](tire: 3) - - doAssert(testArray([u.addr, v.addr, w.addr]) == "123") - doAssert(testArray([w.addr, u.addr, v.addr]) == "312") - - doAssert(testOpenArray([u.addr, v.addr, w.addr]) == "123") - doAssert(testOpenArray([w.addr, u.addr, v.addr]) == "312") - - doAssert(testOpenArray(@[u.addr, v.addr, w.addr]) == "123") - doAssert(testOpenArray(@[w.addr, u.addr, v.addr]) == "312") - -echo "OK" - - diff --git a/tests/array/t9932.nim b/tests/array/t9932.nim new file mode 100644 index 000000000..e3c8abba3 --- /dev/null +++ b/tests/array/t9932.nim @@ -0,0 +1,11 @@ +discard """ +cmd: "nim check $file" +errormsg: "invalid type: 'typedesc[int]' in this context: 'array[0..0, typedesc[int]]' for var" +nimout: ''' +t9932.nim(10, 5) Error: invalid type: 'type' in this context: 'array[0..0, type]' for var +t9932.nim(11, 5) Error: invalid type: 'typedesc[int]' in this context: 'array[0..0, typedesc[int]]' for var +''' +""" + +var y: array[1,type] +var x = [int] diff --git a/tests/array/tarray.nim b/tests/array/tarray.nim index 5e947e745..e9f330e3b 100644 --- a/tests/array/tarray.nim +++ b/tests/array/tarray.nim @@ -1,52 +1,607 @@ discard """ - file: "tarray.nim" - output: "100124" +output: ''' +[4, 5, 6] +[16, 25, 36] +[16, 25, 36] +apple +banana +Fruit +2 +4 +3 +none +skin +paper +@[2, 3, 4]321 +9.0 4.0 +3 +@[(1, 2), (3, 5)] +2 +@["a", "new one", "c"] +@[1, 2, 3] +3 +dflfdjkl__abcdefgasfsgdfgsgdfggsdfasdfsafewfkljdsfajs +dflfdjkl__abcdefgasfsgdfgsgdfggsdfasdfsafewfkljdsfajsdf +kgdchlfniambejop +fjpmholcibdgeakn +2.0 +a:1 +a:2 +a:3 +ret: +ret:1 +ret:12 +123 +''' +joinable: false """ -# simple check for one dimensional arrays + +block tarray: + type + TMyArray = array[0..2, int] + TMyRecord = tuple[x, y: int] + TObj = object + arr: TMyarray + + + proc sum(a: openArray[int]): int = + result = 0 + var i = 0 + while i < len(a): + inc(result, a[i]) + inc(i) + + proc getPos(r: TMyRecord): int = + result = r.x + r.y + + doAssert sum([1, 2, 3, 4]) == 10 + doAssert sum([]) == 0 + doAssert getPos( (x: 5, y: 7) ) == 12 + + # bug #1669 + let filesToCreate = ["tempdir/fl1.a", "tempdir/fl2.b", + "tempdir/tempdir2/fl3.e", "tempdir/tempdir2/tempdir3/fl4.f"] + + var found: array[0..filesToCreate.high, bool] + + doAssert found.len == 4 + + # make sure empty arrays are assignable (bug #6853) + const arr1: array[0, int] = [] + const arr2 = [] + let arr3: array[0, string] = [] + + doAssert(arr1.len == 0) + doAssert(arr2.len == 0) + doAssert(arr3.len == 0) + + # Negative array length is not allowed (#6852) + doAssert(not compiles(block: + var arr: array[-1, int])) + + + proc mul(a, b: TMyarray): TMyArray = + result = a + for i in 0..len(a)-1: + result[i] = a[i] * b[i] + + var + x, y: TMyArray + o: TObj + + proc varArr1(x: var TMyArray): var TMyArray = x + proc varArr2(x: var TObj): var TMyArray = x.arr + + x = [4, 5, 6] + echo repr(varArr1(x)) + + y = x + echo repr(mul(x, y)) + + o.arr = mul(x, y) + echo repr(varArr2(o)) + + + const + myData = [[1,2,3], [4, 5, 6]] + + doAssert myData[0][2] == 3 + + + +block tarraycons: + type + TEnum = enum + eA, eB, eC, eD, eE, eF + + const + myMapping: array[TEnum, array[0..1, int]] = [ + eA: [1, 2], + eB: [3, 4], + [5, 6], + eD: [0: 8, 1: 9], + eE: [0: 8, 9], + eF: [2, 1: 9] + ] + + doAssert myMapping[eC][1] == 6 + + + +block tarraycons_ptr_generic: + type + Fruit = object of RootObj + name: string + Apple = object of Fruit + Banana = object of Fruit + + var + ir = Fruit(name: "Fruit") + ia = Apple(name: "apple") + ib = Banana(name: "banana") + + let x = [ia.addr, ib.addr, ir.addr] + for c in x: echo c.name + + type + Vehicle[T] = object of RootObj + tire: T + Car[T] = object of Vehicle[T] + Bike[T] = object of Vehicle[T] + + var v = Vehicle[int](tire: 3) + var c = Car[int](tire: 4) + var b = Bike[int](tire: 2) + + let y = [b.addr, c.addr, v.addr] + for c in y: echo c.tire + + type + Book[T] = ref object of RootObj + cover: T + Hard[T] = ref object of Book[T] + Soft[T] = ref object of Book[T] + + var bn = Book[string](cover: "none") + var hs = Hard[string](cover: "skin") + var bp = Soft[string](cover: "paper") + + let z = [bn, hs, bp] + for c in z: echo c.cover + + + +block tarraylen: + var a: array[0, int] + doAssert a.len == 0 + doAssert array[0..0, int].len == 1 + doAssert array[0..0, int]([1]).len == 1 + doAssert array[1..1, int].len == 1 + doAssert array[1..1, int]([1]).len == 1 + doAssert array[2, int].len == 2 + doAssert array[2, int]([1, 2]).len == 2 + doAssert array[1..3, int].len == 3 + doAssert array[1..3, int]([1, 2, 3]).len == 3 + doAssert array[0..2, int].len == 3 + doAssert array[0..2, int]([1, 2, 3]).len == 3 + doAssert array[-2 .. -2, int].len == 1 + doAssert([1, 2, 3].len == 3) + doAssert([42].len == 1) + + + + +type ustring = distinct string +converter toUString(s: string): ustring = ustring(s) + +block tarrayindx: + proc putEnv(key, val: string) = + # XXX: we have to leak memory here, as we cannot + # free it before the program ends (says Borland's + # documentation) + var + env: ptr array[0..500000, char] + env = cast[ptr array[0..500000, char]](alloc(len(key) + len(val) + 2)) + for i in 0..len(key)-1: env[i] = key[i] + env[len(key)] = '=' + for i in 0..len(val)-1: + env[len(key)+1+i] = val[i] + + # bug #7153 + const + UnsignedConst = 1024'u + type + SomeObject = object + s1: array[UnsignedConst, uint32] + + var + obj: SomeObject + + doAssert obj.s1[0] == 0 + doAssert obj.s1[0u] == 0 + + # bug #8049 + proc `[]`(s: ustring, i: int): ustring = s + doAssert "abcdefgh"[1..2] == "bc" + doAssert "abcdefgh"[1..^2] == "bcdefg" + + + +block troof: + proc foo[T](x, y: T): T = x + + var a = @[1, 2, 3, 4] + var b: array[3, array[2, float]] = [[1.0,2], [3.0,4], [8.0,9]] + echo a[1.. ^1], a[^2], a[^3], a[^4] + echo b[^1][^1], " ", (b[^2]).foo(b[^1])[^1] + + b[^1] = [8.8, 8.9] + + var c: seq[(int, int)] = @[(1,2), (3,4)] + + proc takeA(x: ptr int) = echo x[] + + takeA(addr c[^1][0]) + c[^1][1] = 5 + echo c + + proc useOpenarray(x: openArray[int]) = + echo x[^2] + + proc mutOpenarray(x: var openArray[string]) = + x[^2] = "new one" + + useOpenarray([1, 2, 3]) + + var z = @["a", "b", "c"] + mutOpenarray(z) + echo z + + # bug #6675 + var y: array[1..5, int] = [1,2,3,4,5] + y[3..5] = [1, 2, 3] + echo y[3..5] + + + var d: array['a'..'c', string] = ["a", "b", "c"] + doAssert d[^1] == "c" + + + + +import strutils, sequtils, typetraits, os type - TMyArray = array[0..2, int] - TMyRecord = tuple[x, y: int] - -proc sum(a: TMyarray): int = - result = 0 - var i = 0 - while i < len(a): - inc(result, a[i]) - inc(i) - -proc sum(a: openarray[int]): int = - result = 0 - var i = 0 - while i < len(a): - inc(result, a[i]) - inc(i) - -proc getPos(r: TMyRecord): int = - result = r.x + r.y - -write(stdout, sum([1, 2, 3, 4])) -write(stdout, sum([])) -write(stdout, getPos( (x: 5, y: 7) )) -#OUT 10012 - -# bug #1669 -let filesToCreate = ["tempdir/fl1.a", "tempdir/fl2.b", - "tempdir/tempdir2/fl3.e", "tempdir/tempdir2/tempdir3/fl4.f"] - -var found: array[0..filesToCreate.high, bool] - -echo found.len - -# make sure empty arrays are assignable (bug #6853) -const arr1: array[0, int] = [] -const arr2 = [] -let arr3: array[0, string] = [] - -doAssert(arr1.len == 0) -doAssert(arr2.len == 0) -doAssert(arr3.len == 0) - -# Negative array length is not allowed (#6852) -doAssert(not compiles(block: - var arr: array[-1, int])) \ No newline at end of file + MetadataArray* = object + data*: array[8, int] + len*: int + +# Commenting the converter removes the error "lib/system.nim(3536, 3) Error: for a 'var' type a variable needs to be passed" +converter toMetadataArray*(se: varargs[int]): MetadataArray {.inline.} = + result.len = se.len + for i in 0..<se.len: + result.data[i] = se[i] + + +block troofregression: + when NimVersion >= "0.17.3": + type Index = int or BackwardsIndex + template `^^`(s, i: untyped): untyped = + when i is BackwardsIndex: + s.len - int(i) + else: i + else: + type Index = int + template `^^`(s, i: untyped): untyped = + i + + ## With Nim devel from the start of the week (~Oct30) I managed to trigger "lib/system.nim(3536, 4) Error: expression has no address" + ## but I can't anymore after updating Nim (Nov5) + ## Now commenting this plain compiles and removes the error "lib/system.nim(3536, 3) Error: for a 'var' type a variable needs to be passed" + proc `[]`(a: var MetadataArray, idx: Index): var int {.inline.} = + a.data[a ^^ idx] + + + ############################## + ### Completely unrelated lib that triggers the issue + + type + MySeq[T] = ref object + data: seq[T] + + proc test[T](sx: MySeq[T]) = + # Removing the backward index removes the error "lib/system.nim(3536, 3) Error: for a 'var' type a variable needs to be passed" + echo sx.data[^1] # error here + + let s = MySeq[int](data: @[1, 2, 3]) + s.test() + + + # bug #6989 + + type Dist = distinct int + + proc mypred[T: Ordinal](x: T): T = T(int(x)-1) + proc cons(x: int): Dist = Dist(x) + + var d: Dist + + template `^+`(s, i: untyped): untyped = + (when i is BackwardsIndex: s.len - int(i) else: int(i)) + + proc `...`[T, U](a: T, b: U): HSlice[T, U] = + result.a = a + result.b = b + + proc `...`[T](b: T): HSlice[int, T] = + result.b = b + + template `...<`(a, b: untyped): untyped = + ## a shortcut for 'a..pred(b)'. + a ... pred(b) + + template check(a, b) = + if $a != b: + echo "Failure ", a, " != ", b + + check typeof(4 ...< 1), "HSlice[system.int, system.int]" + check typeof(4 ...< ^1), "HSlice[system.int, system.BackwardsIndex]" + check typeof(4 ... pred(^1)), "HSlice[system.int, system.BackwardsIndex]" + check typeof(4 ... mypred(8)), "HSlice[system.int, system.int]" + check typeof(4 ... mypred(^1)), "HSlice[system.int, system.BackwardsIndex]" + + var rot = 8 + + proc bug(s: string): string = + result = s + result = result[result.len - rot .. ^1] & "__" & result[0 ..< ^rot] + + const testStr = "abcdefgasfsgdfgsgdfggsdfasdfsafewfkljdsfajsdflfdjkl" + + echo bug(testStr) + echo testStr[testStr.len - 8 .. testStr.len - 1] & "__" & testStr[0 .. testStr.len - pred(rot)] + + var + instructions = readFile(parentDir(currentSourcePath) / "troofregression2.txt").split(',') + programs = "abcdefghijklmnop" + + proc dance(dancers: string): string = + result = dancers + for instr in instructions: + let rem = instr[1 .. instr.high] + case instr[0] + of 's': + let rot = rem.parseInt + result = result[result.len - rot .. ^1] & result[0 ..< ^rot] + of 'x': + let + x = rem.split('/') + a = x[0].parseInt + b = x[1].parseInt + swap(result[a], result[b]) + of 'p': + let + a = result.find(rem[0]) + b = result.find(rem[^1]) + result[a] = rem[^1] + result[b] = rem[0] + else: discard + + proc longDance(dancers: string, iterations = 1_000_000_000): string = + var + dancers = dancers + seen = @[dancers] + for i in 1 .. iterations: + dancers = dancers.dance() + if dancers in seen: + return seen[iterations mod i] + seen.add(dancers) + + echo dance(programs) + echo longDance(programs) + + + +block tunchecked: + {.boundchecks: on.} + type Unchecked = UncheckedArray[char] + + var x = cast[ptr Unchecked](alloc(100)) + x[5] = 'x' + + + +import macros +block t7818: + # bug #7818 + # this is not a macro bug, but array construction bug + # I use macro to avoid object slicing + # see #7712 and #7637 + + type + Vehicle[T] = object of RootObj + tire: T + Car[T] = object of Vehicle[T] + Bike[T] = object of Vehicle[T] + + macro peek(n: typed): untyped = + let val = getTypeImpl(n).treeRepr + newLit(val) + + block test_t7818: + var v = Vehicle[int](tire: 3) + var c = Car[int](tire: 4) + var b = Bike[int](tire: 2) + + let y = peek([c, b, v]) + let z = peek([v, c, b]) + doAssert(y == z) + + block test_t7906_1: + proc init(x: typedesc, y: int): ref x = + result = new(ref x) + result.tire = y + + var v = init(Vehicle[int], 3) + var c = init(Car[int], 4) + var b = init(Bike[int], 2) + + let y = peek([c, b, v]) + let z = peek([v, c, b]) + doAssert(y == z) + + block test_t7906_2: + var v = Vehicle[int](tire: 3) + var c = Car[int](tire: 4) + var b = Bike[int](tire: 2) + + let y = peek([c.addr, b.addr, v.addr]) + let z = peek([v.addr, c.addr, b.addr]) + doAssert(y == z) + + block test_t7906_3: + type + Animal[T] = object of RootObj + hair: T + Mammal[T] = object of Animal[T] + Monkey[T] = object of Mammal[T] + + var v = Animal[int](hair: 3) + var c = Mammal[int](hair: 4) + var b = Monkey[int](hair: 2) + + let z = peek([c.addr, b.addr, v.addr]) + let y = peek([v.addr, c.addr, b.addr]) + doAssert(y == z) + + type + Fruit[T] = ref object of RootObj + color: T + Apple[T] = ref object of Fruit[T] + Banana[T] = ref object of Fruit[T] + + proc testArray[T](x: array[3, Fruit[T]]): string = + result = "" + for c in x: + result.add $c.color + + proc testOpenArray[T](x: openArray[Fruit[T]]): string = + result = "" + for c in x: + result.add $c.color + + block test_t7906_4: + var v = Fruit[int](color: 3) + var c = Apple[int](color: 4) + var b = Banana[int](color: 2) + + let y = peek([c, b, v]) + let z = peek([v, c, b]) + doAssert(y == z) + + block test_t7906_5: + var a = Fruit[int](color: 1) + var b = Apple[int](color: 2) + var c = Banana[int](color: 3) + + doAssert(testArray([a, b, c]) == "123") + doAssert(testArray([b, c, a]) == "231") + + doAssert(testOpenArray([a, b, c]) == "123") + doAssert(testOpenArray([b, c, a]) == "231") + + doAssert(testOpenArray(@[a, b, c]) == "123") + doAssert(testOpenArray(@[b, c, a]) == "231") + + proc testArray[T](x: array[3, ptr Vehicle[T]]): string = + result = "" + for c in x: + result.add $c.tire + + proc testOpenArray[T](x: openArray[ptr Vehicle[T]]): string = + result = "" + for c in x: + result.add $c.tire + + block test_t7906_6: + var u = Vehicle[int](tire: 1) + var v = Bike[int](tire: 2) + var w = Car[int](tire: 3) + + doAssert(testArray([u.addr, v.addr, w.addr]) == "123") + doAssert(testArray([w.addr, u.addr, v.addr]) == "312") + + doAssert(testOpenArray([u.addr, v.addr, w.addr]) == "123") + doAssert(testOpenArray([w.addr, u.addr, v.addr]) == "312") + + doAssert(testOpenArray(@[u.addr, v.addr, w.addr]) == "123") + doAssert(testOpenArray(@[w.addr, u.addr, v.addr]) == "312") + +block trelaxedindextyp: + # any integral type is allowed as index + proc foo(x: ptr UncheckedArray[int]; idx: uint64) = echo x[idx] + proc foo(x: seq[int]; idx: uint64) = echo x[idx] + proc foo(x: string|cstring; idx: uint64) = echo x[idx] + proc foo(x: openArray[int]; idx: uint64) = echo x[idx] + +block t3899: + # https://github.com/nim-lang/Nim/issues/3899 + type O = object + a: array[1..2,float] + template `[]`(x: O, i: int): float = + x.a[i] + const c = O(a: [1.0,2.0]) + echo c[2] + +block arrayLiterals: + type ABC = enum A, B, C + template Idx[IdxT, ElemT](arr: array[IdxT, ElemT]): untyped = IdxT + doAssert [A: 0, B: 1].Idx is range[A..B] + doAssert [A: 0, 1, 3].Idx is ABC + doAssert [1: 2][1] == 2 + doAssert [-1'i8: 2][-1] == 2 + doAssert [-1'i8: 2, 3, 4, 5].Idx is range[-1'i8..2'i8] + + + +# bug #8316 + +proc myAppend[T](a:T):string= + echo "a:", a + return $a + +template append2*(args: varargs[string, myAppend]): string = + var ret:string + for a in args: + echo "ret:", ret + ret.add(a) + ret + +let foo = append2("1", "2", "3") +echo foo + +block t12466: + # https://github.com/nim-lang/Nim/issues/12466 + var a: array[288, uint16] + for i in 0'u16 ..< 144'u16: + a[0'u16 + i] = i + for i in 0'u16 ..< 8'u16: + a[0'u16 + i] = i + +block t17705: + # https://github.com/nim-lang/Nim/pull/17705 + var a = array[0, int].low + a = int(a) + var b = array[0, int].high + b = int(b) + +block t18643: + # https://github.com/nim-lang/Nim/issues/18643 + let a: array[0, int] = [] + var caught = false + let b = 9999999 + try: + echo a[b] + except IndexDefect: + caught = true + doAssert caught, "IndexDefect not caught!" diff --git a/tests/array/tarray2.nim b/tests/array/tarray2.nim deleted file mode 100644 index 1951e6e97..000000000 --- a/tests/array/tarray2.nim +++ /dev/null @@ -1,36 +0,0 @@ -discard """ - file: "tarray2.nim" - output: "[4, 5, 6]\n\n[16, 25, 36]\n\n[16, 25, 36]" -""" -# simple check for one dimensional arrays - -type - TMyArray = array[0..2, int] - - TObj = object - arr: TMyarray - -proc mul(a, b: TMyarray): TMyArray = - result = a - for i in 0..len(a)-1: - result[i] = a[i] * b[i] - -var - x, y: TMyArray - o: TObj - -proc varArr1(x: var TMyArray): var TMyArray = x -proc varArr2(x: var TObj): var TMyArray = x.arr - -x = [ 4, 5, 6 ] -echo repr(varArr1(x)) - -y = x -echo repr(mul(x, y)) - -o.arr = mul(x, y) -echo repr(varArr2(o)) - -#OUT [16, 25, 36] - - diff --git a/tests/array/tarray3.nim b/tests/array/tarray3.nim deleted file mode 100644 index 24bf26fda..000000000 --- a/tests/array/tarray3.nim +++ /dev/null @@ -1,13 +0,0 @@ -discard """ - file: "tarray3.nim" - output: "3" -""" -# simple check for two dimensional arrays - -const - myData = [[1,2,3], [4, 5, 6]] - -echo myData[0][2] #OUT 3 - - - diff --git a/tests/array/tarraycons.nim b/tests/array/tarraycons.nim index 9f09fd405..b6ebe55c8 100644 --- a/tests/array/tarraycons.nim +++ b/tests/array/tarraycons.nim @@ -1,7 +1,7 @@ discard """ + errormsg: "invalid order in array constructor" file: "tarraycons.nim" line: 14 - errormsg: "invalid order in array constructor" """ type @@ -19,6 +19,3 @@ const ] echo myMapping[eC][1] - - - diff --git a/tests/array/tarraycons2.nim b/tests/array/tarraycons2.nim deleted file mode 100644 index 72d9e374e..000000000 --- a/tests/array/tarraycons2.nim +++ /dev/null @@ -1,23 +0,0 @@ -discard """ - file: "tarraycons.nim" - output: "6" -""" - -type - TEnum = enum - eA, eB, eC, eD, eE, eF - -const - myMapping: array[TEnum, array[0..1, int]] = [ - eA: [1, 2], - eB: [3, 4], - [5, 6], - eD: [0: 8, 1: 9], - eE: [0: 8, 9], - eF: [2, 1: 9] - ] - -echo myMapping[eC][1] - - - diff --git a/tests/array/tarraycons_ptr_generic.nim b/tests/array/tarraycons_ptr_generic.nim deleted file mode 100644 index eb89a196f..000000000 --- a/tests/array/tarraycons_ptr_generic.nim +++ /dev/null @@ -1,51 +0,0 @@ -discard """ - output: '''apple -banana -Fruit -2 -4 -3 -none -skin -paper -''' -""" -type - Fruit = object of RootObj - name: string - Apple = object of Fruit - Banana = object of Fruit - -var - ir = Fruit(name: "Fruit") - ia = Apple(name: "apple") - ib = Banana(name: "banana") - -let x = [ia.addr, ib.addr, ir.addr] -for c in x: echo c.name - -type - Vehicle[T] = object of RootObj - tire: T - Car[T] = object of Vehicle[T] - Bike[T] = object of Vehicle[T] - -var v = Vehicle[int](tire: 3) -var c = Car[int](tire: 4) -var b = Bike[int](tire: 2) - -let y = [b.addr, c.addr, v.addr] -for c in y: echo c.tire - -type - Book[T] = ref object of RootObj - cover: T - Hard[T] = ref object of Book[T] - Soft[T] = ref object of Book[T] - -var bn = Book[string](cover: "none") -var hs = Hard[string](cover: "skin") -var bp = Soft[string](cover: "paper") - -let z = [bn, hs, bp] -for c in z: echo c.cover diff --git a/tests/array/tarraycons_ptr_generic2.nim b/tests/array/tarraycons_ptr_generic2.nim index fce7af669..f6ed32b58 100644 --- a/tests/array/tarraycons_ptr_generic2.nim +++ b/tests/array/tarraycons_ptr_generic2.nim @@ -1,7 +1,7 @@ discard """ + errormsg: "type mismatch: got <ptr Hard[system.string]> but expected 'Book[system.string]'" file: "tarraycons_ptr_generic2.nim" line: 17 - errormsg: "type mismatch: got <ptr Hard[system.string]> but expected 'Book[system.string]'" """ type diff --git a/tests/array/tarraylen.nim b/tests/array/tarraylen.nim deleted file mode 100644 index e9612de58..000000000 --- a/tests/array/tarraylen.nim +++ /dev/null @@ -1,18 +0,0 @@ -discard """ - output: "" -""" -var a: array[0, int] -doAssert a.len == 0 -doAssert array[0..0, int].len == 1 -doAssert array[0..0, int]([1]).len == 1 -doAssert array[1..1, int].len == 1 -doAssert array[1..1, int]([1]).len == 1 -doAssert array[2, int].len == 2 -doAssert array[2, int]([1, 2]).len == 2 -doAssert array[1..3, int].len == 3 -doAssert array[1..3, int]([1, 2, 3]).len == 3 -doAssert array[0..2, int].len == 3 -doAssert array[0..2, int]([1, 2, 3]).len == 3 -doAssert array[-2 .. -2, int].len == 1 -doAssert([1, 2, 3].len == 3) -doAssert([42].len == 1) \ No newline at end of file diff --git a/tests/array/tarrindx.nim b/tests/array/tarrindx.nim deleted file mode 100644 index 3bb6b0148..000000000 --- a/tests/array/tarrindx.nim +++ /dev/null @@ -1,31 +0,0 @@ -discard """ - output: '''0 -0''' -""" - -# test another strange bug ... (I hate this compiler; it is much too buggy!) - -proc putEnv(key, val: string) = - # XXX: we have to leak memory here, as we cannot - # free it before the program ends (says Borland's - # documentation) - var - env: ptr array[0..500000, char] - env = cast[ptr array[0..500000, char]](alloc(len(key) + len(val) + 2)) - for i in 0..len(key)-1: env[i] = key[i] - env[len(key)] = '=' - for i in 0..len(val)-1: - env[len(key)+1+i] = val[i] - -# bug #7153 -const - UnsignedConst = 1024'u -type - SomeObject* = object - s1: array[UnsignedConst, uint32] - -var - obj: SomeObject - -echo obj.s1[0] -echo obj.s1[0u] diff --git a/tests/array/tidx_lit_err1.nim b/tests/array/tidx_lit_err1.nim new file mode 100644 index 000000000..b1823e5a3 --- /dev/null +++ b/tests/array/tidx_lit_err1.nim @@ -0,0 +1,6 @@ +discard """ + errormsg: "size of array exceeds range of index type 'range 1..2(Color)' by 3 elements" + line: 6 +""" +type Color = enum Red, Green, Blue +let y = [Green: 0, 1, 2, 3, 4] diff --git a/tests/array/tidx_lit_err2.nim b/tests/array/tidx_lit_err2.nim new file mode 100644 index 000000000..75f5f227b --- /dev/null +++ b/tests/array/tidx_lit_err2.nim @@ -0,0 +1,5 @@ +discard """ + errormsg: "expected ordinal value for array index, got '\"string\"'" + line: 5 +""" +let x = ["string": 0, "index": 1] diff --git a/tests/array/tidx_lit_err3.nim b/tests/array/tidx_lit_err3.nim new file mode 100644 index 000000000..95922bc50 --- /dev/null +++ b/tests/array/tidx_lit_err3.nim @@ -0,0 +1,5 @@ +discard """ + errormsg: "size of array exceeds range of index type 'range 2147483646..2147483647(int32)' by 1 elements" + line: 5 +""" +echo [high(int32)-1: 1, 2, 3] diff --git a/tests/array/tinvalidarrayaccess.nim b/tests/array/tinvalidarrayaccess.nim new file mode 100644 index 000000000..f8bce45ef --- /dev/null +++ b/tests/array/tinvalidarrayaccess.nim @@ -0,0 +1,21 @@ +discard """ + errormsg: "index 2 not in 0 .. 1" + line: 18 +""" +block: + try: + let a = @[1,2] + echo a[3] + except Exception as e: + doAssert e.msg == "index 3 not in 0 .. 1" + # note: this is not being tested, because the CT error happens before + +block: + type TTestArr = array[0..1, int16] + var f: TTestArr + f[0] = 30 + f[1] = 40 + f[2] = 50 + f[3] = 60 + + echo(repr(f)) diff --git a/tests/array/tinvalidarrayaccess2.nim b/tests/array/tinvalidarrayaccess2.nim new file mode 100644 index 000000000..0a0703834 --- /dev/null +++ b/tests/array/tinvalidarrayaccess2.nim @@ -0,0 +1,10 @@ +discard """ + errormsg: "index 3 not in 0 .. 1" + line: 9 +""" + +# Note: merge in tinvalidarrayaccess.nim pending https://github.com/nim-lang/Nim/issues/9906 + +let a = [1,2] +echo a[3] + diff --git a/tests/array/tlargeindex.nim b/tests/array/tlargeindex.nim new file mode 100644 index 000000000..61bcbd61d --- /dev/null +++ b/tests/array/tlargeindex.nim @@ -0,0 +1,18 @@ +discard """ + cmd: "nim check --hints:off $file" +""" + +# issue #17163 +var e: array[int32, byte] #[tt.Error + ^ index type 'int32' for array is too large]# +var f: array[uint32, byte] #[tt.Error + ^ index type 'uint32' for array is too large]# +var g: array[int64, byte] #[tt.Error + ^ index type 'int64' for array is too large]# +var h: array[uint64, byte] #[tt.Error + ^ index type 'uint64' for array is too large]# + +# crash in issue #23204 +proc y[N](): array[N, int] = default(array[N, int]) #[tt.Error + ^ index type 'int' for array is too large]# +discard y[int]() diff --git a/tests/array/troof1.nim b/tests/array/troof1.nim deleted file mode 100644 index b486c3448..000000000 --- a/tests/array/troof1.nim +++ /dev/null @@ -1,43 +0,0 @@ -discard """ - output: '''@[2, 3, 4]321 -9.0 4.0 -3 -@[(Field0: 1, Field1: 2), (Field0: 3, Field1: 5)] -2 -@["a", "new one", "c"] -@[1, 2, 3]''' -""" - -proc foo[T](x, y: T): T = x - -var a = @[1, 2, 3, 4] -var b: array[3, array[2, float]] = [[1.0,2], [3.0,4], [8.0,9]] -echo a[1.. ^1], a[^2], a[^3], a[^4] -echo b[^1][^1], " ", (b[^2]).foo(b[^1])[^1] - -b[^1] = [8.8, 8.9] - -var c: seq[(int, int)] = @[(1,2), (3,4)] - -proc takeA(x: ptr int) = echo x[] - -takeA(addr c[^1][0]) -c[^1][1] = 5 -echo c - -proc useOpenarray(x: openArray[int]) = - echo x[^2] - -proc mutOpenarray(x: var openArray[string]) = - x[^2] = "new one" - -useOpenarray([1, 2, 3]) - -var z = @["a", "b", "c"] -mutOpenarray(z) -echo z - -# bug #6675 -var y: array[1..5, int] = [1,2,3,4,5] -y[3..5] = [1, 2, 3] -echo y[3..5] diff --git a/tests/array/troof3.nim b/tests/array/troof3.nim deleted file mode 100644 index efe0eafb8..000000000 --- a/tests/array/troof3.nim +++ /dev/null @@ -1,7 +0,0 @@ -discard """ - output: '''c''' -""" - -var a: array['a'..'c', string] = ["a", "b", "c"] - -echo a[^1] diff --git a/tests/array/troofregression.nim b/tests/array/troofregression.nim deleted file mode 100644 index 0b96123a4..000000000 --- a/tests/array/troofregression.nim +++ /dev/null @@ -1,46 +0,0 @@ -############################### -#### part from Arraymancer - -type - MetadataArray* = object - data*: array[8, int] - len*: int - -# Commenting the converter removes the error "lib/system.nim(3536, 3) Error: for a 'var' type a variable needs to be passed" -converter toMetadataArray*(se: varargs[int]): MetadataArray {.inline.} = - result.len = se.len - for i in 0..<se.len: - result.data[i] = se[i] - - -when NimVersion >= "0.17.3": - type Index = int or BackwardsIndex - template `^^`(s, i: untyped): untyped = - when i is BackwardsIndex: - s.len - int(i) - else: i -else: - type Index = int - template `^^`(s, i: untyped): untyped = - i - -## With Nim devel from the start of the week (~Oct30) I managed to trigger "lib/system.nim(3536, 4) Error: expression has no address" -## but I can't anymore after updating Nim (Nov5) -## Now commenting this plain compiles and removes the error "lib/system.nim(3536, 3) Error: for a 'var' type a variable needs to be passed" -proc `[]`*(a: var MetadataArray, idx: Index): var int {.inline.} = - a.data[a ^^ idx] - - -############################## -### Completely unrelated lib that triggers the issue - -type - MySeq[T] = ref object - data: seq[T] - -proc test[T](sx: MySeq[T]) = - # Removing the backward index removes the error "lib/system.nim(3536, 3) Error: for a 'var' type a variable needs to be passed" - echo sx.data[^1] # error here - -let s = MySeq[int](data: @[1, 2, 3]) -s.test() diff --git a/tests/array/troofregression2.nim b/tests/array/troofregression2.nim deleted file mode 100644 index a594d8a47..000000000 --- a/tests/array/troofregression2.nim +++ /dev/null @@ -1,102 +0,0 @@ -discard """ - output: '''OK -OK -OK -OK -OK -dflfdjkl__abcdefgasfsgdfgsgdfggsdfasdfsafewfkljdsfajs -dflfdjkl__abcdefgasfsgdfgsgdfggsdfasdfsafewfkljdsfajsdf -kgdchlfniambejop -fjpmholcibdgeakn -''' -""" - -import strutils, sequtils, typetraits, os -# bug #6989 - -type Dist = distinct int - -proc mypred[T: Ordinal](x: T): T = T(int(x)-1) -proc cons(x: int): Dist = Dist(x) - -var d: Dist - -template `^+`(s, i: untyped): untyped = - (when i is BackwardsIndex: s.len - int(i) else: int(i)) - -proc `...`*[T, U](a: T, b: U): HSlice[T, U] = - result.a = a - result.b = b - -proc `...`*[T](b: T): HSlice[int, T] = - result.b = b - -template `...<`*(a, b: untyped): untyped = - ## a shortcut for 'a..pred(b)'. - a ... pred(b) - -template check(a, b) = - if $a == b: echo "OK" - else: echo "Failure ", a, " != ", b - -check type(4 ...< 1), "HSlice[system.int, system.int]" - -check type(4 ...< ^1), "HSlice[system.int, system.BackwardsIndex]" -check type(4 ... pred(^1)), "HSlice[system.int, system.BackwardsIndex]" - -check type(4 ... mypred(8)), "HSlice[system.int, system.int]" - -check type(4 ... mypred(^1)), "HSlice[system.int, system.BackwardsIndex]" - -var rot = 8 - -proc bug(s: string): string = - result = s - result = result[result.len - rot .. ^1] & "__" & result[0 ..< ^rot] - -const testStr = "abcdefgasfsgdfgsgdfggsdfasdfsafewfkljdsfajsdflfdjkl" - -echo bug(testStr) -echo testStr[testStr.len - 8 .. testStr.len - 1] & "__" & testStr[0 .. testStr.len - pred(rot)] - - - -var - instructions = readFile(getAppDir() / "troofregression2.txt").split(',') - programs = "abcdefghijklmnop" - -proc dance(dancers: string): string = - result = dancers - for instr in instructions: - let rem = instr[1 .. instr.high] - case instr[0] - of 's': - let rot = rem.parseInt - result = result[result.len - rot .. ^1] & result[0 ..< ^rot] - of 'x': - let - x = rem.split('/') - a = x[0].parseInt - b = x[1].parseInt - swap(result[a], result[b]) - of 'p': - let - a = result.find(rem[0]) - b = result.find(rem[^1]) - result[a] = rem[^1] - result[b] = rem[0] - else: discard - -proc longDance(dancers: string, iterations = 1_000_000_000): string = - var - dancers = dancers - seen = @[dancers] - for i in 1 .. iterations: - dancers = dancers.dance() - if dancers in seen: - return seen[iterations mod i] - seen.add(dancers) - - -echo dance(programs) -echo longDance(programs) diff --git a/tests/array/tunchecked.nim b/tests/array/tunchecked.nim deleted file mode 100644 index f5ac3642d..000000000 --- a/tests/array/tunchecked.nim +++ /dev/null @@ -1,5 +0,0 @@ -{.boundchecks: on.} -type Unchecked {.unchecked.} = array[0, char] - -var x = cast[ptr Unchecked](alloc(100)) -x[5] = 'x' |