From 0d48bafcf08bb2be72029ccebc745b5594d49731 Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Tue, 16 Oct 2018 20:09:00 +0200 Subject: [PATCH] fixes a regression about indexing into UncheckedArray --- compiler/semexprs.nim | 13 ++++++++++++- tests/array/tarray.nim | 4 ++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 78ea82bb9e..b811170f73 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -1358,7 +1358,7 @@ proc semSubscript(c: PContext, n: PNode, flags: TExprFlags): PNode = case arr.kind of tyArray, tyOpenArray, tyVarargs, tySequence, tyString, - tyCString, tyUncheckedArray: + tyCString: if n.len != 2: return nil n.sons[0] = makeDeref(n.sons[0]) for i in countup(1, sonsLen(n) - 1): @@ -1371,6 +1371,17 @@ proc semSubscript(c: PContext, n: PNode, flags: TExprFlags): PNode = result = n result.typ = elemType(arr) #GlobalError(n.info, errIndexTypesDoNotMatch) + of tyUncheckedArray: + if n.len != 2: return nil + n.sons[0] = makeDeref(n.sons[0]) + for i in countup(1, sonsLen(n) - 1): + n.sons[i] = semExprWithType(c, n.sons[i], + flags*{efInTypeof, efDetermineType}) + # index into unchecked array must be some integer type: + if n.sons[1].typ.skipTypes(abstractRange-{tyDistinct}).kind in + {tyInt..tyInt64, tyUInt..tyUInt64}: + result = n + result.typ = elemType(arr) of tyTypeDesc: # The result so far is a tyTypeDesc bound # a tyGenericBody. The line below will substitute diff --git a/tests/array/tarray.nim b/tests/array/tarray.nim index 948e63a893..e35a804eee 100644 --- a/tests/array/tarray.nim +++ b/tests/array/tarray.nim @@ -532,3 +532,7 @@ block t7818: doAssert(testOpenArray(@[u.addr, v.addr, w.addr]) == "123") doAssert(testOpenArray(@[w.addr, u.addr, v.addr]) == "312") + +# regression regarding unchecked array indexing: +proc foo(x: ptr UncheckedArray[int]; idx: uint64) = + echo x[idx]