summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/semexprs.nim29
-rw-r--r--tests/array/tarray.nim9
2 files changed, 18 insertions, 20 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index b811170f7..883a8c0ae 100644
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -1357,28 +1357,23 @@ proc semSubscript(c: PContext, n: PNode, flags: TExprFlags): PNode =
       arr = arr.base
 
   case arr.kind
-  of tyArray, tyOpenArray, tyVarargs, tySequence, tyString,
-     tyCString:
+  of tyArray, tyOpenArray, tyVarargs, tySequence, tyString, tyCString,
+    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})
-    var indexType = if arr.kind == tyArray: arr.sons[0] else: getSysType(c.graph, n.info, tyInt)
-    var arg = indexTypesMatch(c, indexType, n.sons[1].typ, n.sons[1])
-    if arg != nil:
-      n.sons[1] = arg
-      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
+    # Arrays index type is dictated by the range's type
+    if arr.kind == tyArray:
+      var indexType = arr.sons[0]
+      var arg = indexTypesMatch(c, indexType, n.sons[1].typ, n.sons[1])
+      if arg != nil:
+        n.sons[1] = arg
+        result = n
+        result.typ = elemType(arr)
+    # Other types have a bit more of leeway
+    elif n.sons[1].typ.skipTypes(abstractRange-{tyDistinct}).kind in
         {tyInt..tyInt64, tyUInt..tyUInt64}:
       result = n
       result.typ = elemType(arr)
diff --git a/tests/array/tarray.nim b/tests/array/tarray.nim
index e35a804ee..4a31a4d6d 100644
--- a/tests/array/tarray.nim
+++ b/tests/array/tarray.nim
@@ -533,6 +533,9 @@ 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]
+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]