summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/semtypes.nim12
-rw-r--r--compiler/vmgen.nim2
-rw-r--r--tests/vm/tarrayboundeval.nim23
3 files changed, 35 insertions, 2 deletions
diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim
index c53dc0f7d..e8dcea731 100644
--- a/compiler/semtypes.nim
+++ b/compiler/semtypes.nim
@@ -225,8 +225,18 @@ proc semArray(c: PContext, n: PNode, prev: PType): PType =
         # properly filled-out in semtypinst (see how tyStaticExpr
         # is handled there).
         indx = makeRangeWithStaticExpr(c, e)
-      else:
+      elif e.kind == nkIdent:
         indx = e.typ.skipTypes({tyTypeDesc})
+      else:
+        let x = semConstExpr(c, e)
+        if x.kind in {nkIntLit..nkUInt64Lit}:
+          indx = makeRangeType(c, 0, x.intVal-1, n.info, 
+                               x.typ.skipTypes({tyTypeDesc}))
+        else:
+          indx = x.typ.skipTypes({tyTypeDesc})
+          if not isOrdinalType(indx):
+            localError(n[1].info, errOrdinalTypeExpected)
+          #localError(n[1].info, errConstExprExpected)
     addSonSkipIntLit(result, indx)
     if indx.kind == tyGenericInst: indx = lastSon(indx)
     if indx.kind notin {tyGenericParam, tyStatic, tyFromExpr}:
diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim
index 434cb0932..7c0c3d4f5 100644
--- a/compiler/vmgen.nim
+++ b/compiler/vmgen.nim
@@ -1501,7 +1501,7 @@ proc gen(c: PCtx; n: PNode; dest: var TDest; flags: TGenFlags = {}) =
     else:
       localError(n.info, errGenerated, "VM is not allowed to 'cast'")
   else:
-    internalError n.info, "too implement " & $n.kind
+    internalError n.info, "cannot generate VM code for " & n.renderTree
 
 proc removeLastEof(c: PCtx) =
   let last = c.code.len-1
diff --git a/tests/vm/tarrayboundeval.nim b/tests/vm/tarrayboundeval.nim
new file mode 100644
index 000000000..9b33a2415
--- /dev/null
+++ b/tests/vm/tarrayboundeval.nim
@@ -0,0 +1,23 @@
+discard """
+  output: '''7
+8 8'''
+"""
+
+#bug 1063
+
+const
+  KeyMax = 227
+  myconst = int((KeyMax + 31) / 32)
+
+type
+  FU = array[int((KeyMax + 31) / 32), cuint]
+
+echo FU.high
+
+type 
+  PKeyboard* = ptr object
+  TKeyboardState* = object
+    display*: pointer
+    internal: array[int((KeyMax + 31)/32), cuint]
+    
+echo myconst, " ", int((KeyMax + 31) / 32)