summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorDominik Picheta <dominikpicheta@googlemail.com>2014-04-07 20:31:59 +0100
committerDominik Picheta <dominikpicheta@googlemail.com>2014-04-07 20:31:59 +0100
commit12e247acc673a674103876494368535f62bcb4a3 (patch)
tree00dbaa4cdb8a75d92ae5dccd5fdc4eeeb23fc004
parent152fcc8ec4fb88e97222fe6b3bfb9852ed487b37 (diff)
parent3197ec8e7289fc0861af05f8ecc357b54099f702 (diff)
downloadNim-12e247acc673a674103876494368535f62bcb4a3.tar.gz
Merge branch 'devel' of github.com:Araq/Nimrod into devel
-rw-r--r--compiler/semtypes.nim10
-rw-r--r--compiler/vmgen.nim2
-rw-r--r--tests/vm/tarrayboundeval.nim23
-rw-r--r--web/news.txt7
4 files changed, 39 insertions, 3 deletions
diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim
index c53dc0f7d..a563cf06c 100644
--- a/compiler/semtypes.nim
+++ b/compiler/semtypes.nim
@@ -225,8 +225,16 @@ 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})
+          #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)
diff --git a/web/news.txt b/web/news.txt
index 536cce534..4aaf10992 100644
--- a/web/news.txt
+++ b/web/news.txt
@@ -30,7 +30,7 @@ kqueue has not been implemented yet but will be in the future.
 The Asynchronous IO API provides both
 a callback interface and an interface which allows you to write code as you
 would if you were writing synchronous code. The latter is done through
-the use of an ``await`` keyword which behaves similar to C#'s await. The
+the use of an ``await`` macro which behaves similar to C#'s await. The
 following is a very simple chat server demonstrating Nimrod's new async
 capabilities.
 
@@ -59,6 +59,11 @@ capabilities.
   serve()
   runForever()
 
+
+Note that this feature has been implemented with Nimrod's macro system and so
+``await`` and ``async`` are no keywords.
+
+
 Library Additions
 -----------------