summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2016-06-01 01:59:06 +0200
committerAndreas Rumpf <rumpf_a@web.de>2016-06-01 11:01:03 +0200
commit041054e0389a10caa9614ed003739cdfece3941d (patch)
tree0472fe02e9fbfe8127f5d9169769e90cffa53a44
parent660cd7ed701c3af5f8b247ee5545d278f6b931da (diff)
downloadNim-041054e0389a10caa9614ed003739cdfece3941d.tar.gz
fixes #4207
-rw-r--r--compiler/semmacrosanity.nim16
-rw-r--r--compiler/semstmts.nim2
-rw-r--r--todo.txt1
3 files changed, 12 insertions, 7 deletions
diff --git a/compiler/semmacrosanity.nim b/compiler/semmacrosanity.nim
index 150680af7..6cd5c4a3c 100644
--- a/compiler/semmacrosanity.nim
+++ b/compiler/semmacrosanity.nim
@@ -12,25 +12,26 @@
 
 import ast, astalgo, msgs, types
 
-proc ithField(n: PNode, field: int): PSym =
+proc ithField(n: PNode, field: var int): PSym =
   result = nil
   case n.kind
   of nkRecList:
     for i in countup(0, sonsLen(n) - 1):
-      result = ithField(n.sons[i], field-i)
+      result = ithField(n.sons[i], field)
       if result != nil: return
   of nkRecCase:
     if n.sons[0].kind != nkSym: internalError(n.info, "ithField")
-    result = ithField(n.sons[0], field-1)
+    result = ithField(n.sons[0], field)
     if result != nil: return
     for i in countup(1, sonsLen(n) - 1):
       case n.sons[i].kind
       of nkOfBranch, nkElse:
-        result = ithField(lastSon(n.sons[i]), field-1)
+        result = ithField(lastSon(n.sons[i]), field)
         if result != nil: return
       else: internalError(n.info, "ithField(record case branch)")
   of nkSym:
     if field == 0: result = n.sym
+    else: dec(field)
   else: discard
 
 proc annotateType*(n: PNode, t: PType) =
@@ -39,10 +40,13 @@ proc annotateType*(n: PNode, t: PType) =
   # to not to skip tyGenericInst
   case n.kind
   of nkObjConstr:
+    let x = t.skipTypes(abstractPtrs)
     n.typ = t
     for i in 1 .. <n.len:
-      let field = x.n.ithField(i - 1)
-      if field.isNil: globalError n.info, "invalid field at index " & $i
+      var j = i-1
+      let field = x.n.ithField(j)
+      if field.isNil:
+        globalError n.info, "invalid field at index " & $i
       else:
         internalAssert(n.sons[i].kind == nkExprColonExpr)
         annotateType(n.sons[i].sons[1], field.typ)
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index 9615211fc..0b2343c10 100644
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -536,7 +536,7 @@ proc semConst(c: PContext, n: PNode): PNode =
       localError(a.sons[2].info, errConstExprExpected)
       continue
     if typeAllowed(typ, skConst) != nil and def.kind != nkNilLit:
-      localError(a.info, errXisNoType, typeToString(typ))
+      localError(a.info, "invalid type for const: " & typeToString(typ))
       continue
     v.typ = typ
     v.ast = def               # no need to copy
diff --git a/todo.txt b/todo.txt
index f14b169cf..542f096fb 100644
--- a/todo.txt
+++ b/todo.txt
@@ -2,6 +2,7 @@
 nim c --gc:v2 -r -d:useSysAssert -d:useGcAssert -d:smokeCycles -d:useRealtimeGc tests/gc/gctest
 
 - document ``this`` pragma
+- https://github.com/nim-lang/Nim/issues/3898
 
 essential for 1.0
 =================