diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2016-06-01 01:59:06 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2016-06-01 11:01:03 +0200 |
commit | 041054e0389a10caa9614ed003739cdfece3941d (patch) | |
tree | 0472fe02e9fbfe8127f5d9169769e90cffa53a44 | |
parent | 660cd7ed701c3af5f8b247ee5545d278f6b931da (diff) | |
download | Nim-041054e0389a10caa9614ed003739cdfece3941d.tar.gz |
fixes #4207
-rw-r--r-- | compiler/semmacrosanity.nim | 16 | ||||
-rw-r--r-- | compiler/semstmts.nim | 2 | ||||
-rw-r--r-- | todo.txt | 1 |
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 ================= |