diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/ccgtrav.nim | 3 | ||||
-rw-r--r-- | compiler/renderer.nim | 6 | ||||
-rw-r--r-- | compiler/semexprs.nim | 4 | ||||
-rw-r--r-- | compiler/semtempl.nim | 8 |
4 files changed, 16 insertions, 5 deletions
diff --git a/compiler/ccgtrav.nim b/compiler/ccgtrav.nim index 457093c61..982f88cbd 100644 --- a/compiler/ccgtrav.nim +++ b/compiler/ccgtrav.nim @@ -32,6 +32,9 @@ proc genTraverseProc(c: var TTraversalClosure, accessor: Rope, n: PNode; if (n.sons[0].kind != nkSym): internalError(n.info, "genTraverseProc") var p = c.p let disc = n.sons[0].sym + if disc.loc.r == nil: fillObjectFields(c.p.module, typ) + if disc.loc.t == nil: + internalError(n.info, "genTraverseProc()") lineF(p, cpsStmts, "switch ($1.$2) {$n", [accessor, disc.loc.r]) for i in countup(1, sonsLen(n) - 1): let branch = n.sons[i] diff --git a/compiler/renderer.nim b/compiler/renderer.nim index 5ce8414d6..badcaea66 100644 --- a/compiler/renderer.nim +++ b/compiler/renderer.nim @@ -851,7 +851,11 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) = put(g, tkRStrLit, '\"' & replace(n[1].strVal, "\"", "\"\"") & '\"') else: gsub(g, n.sons[1]) - of nkHiddenStdConv, nkHiddenSubConv, nkHiddenCallConv: gsub(g, n.sons[1]) + of nkHiddenStdConv, nkHiddenSubConv, nkHiddenCallConv: + if n.len >= 2: + gsub(g, n.sons[1]) + else: + put(g, tkSymbol, "(wrong conv)") of nkCast: put(g, tkCast, "cast") put(g, tkBracketLe, "[") diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index ba60442d6..a419cd000 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -2324,12 +2324,16 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode = of nkIfExpr, nkIfStmt: result = semIf(c, n) of nkHiddenStdConv, nkHiddenSubConv, nkConv, nkHiddenCallConv: checkSonsLen(n, 2) + considerGenSyms(c, n) of nkStringToCString, nkCStringToString, nkObjDownConv, nkObjUpConv: checkSonsLen(n, 1) + considerGenSyms(c, n) of nkChckRangeF, nkChckRange64, nkChckRange: checkSonsLen(n, 3) + considerGenSyms(c, n) of nkCheckedFieldExpr: checkMinSonsLen(n, 2) + considerGenSyms(c, n) of nkTableConstr: result = semTableConstr(c, n) of nkClosedSymChoice, nkOpenSymChoice: diff --git a/compiler/semtempl.nim b/compiler/semtempl.nim index f809b6a50..5ac2e678a 100644 --- a/compiler/semtempl.nim +++ b/compiler/semtempl.nim @@ -144,10 +144,8 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode proc openScope(c: var TemplCtx) = openScope(c.c) - inc c.scopeN proc closeScope(c: var TemplCtx) = - dec c.scopeN closeScope(c.c) proc semTemplBodyScope(c: var TemplCtx, n: PNode): PNode = @@ -172,7 +170,6 @@ proc newGenSym(kind: TSymKind, n: PNode, c: var TemplCtx): PSym = result = newSym(kind, considerQuotedIdent(n), c.owner, n.info) incl(result.flags, sfGenSym) incl(result.flags, sfShadowed) - #if c.scopeN == 0: incl(result.flags, sfFromGeneric) proc addLocalDecl(c: var TemplCtx, n: var PNode, k: TSymKind) = # locals default to 'gensym': @@ -275,10 +272,12 @@ proc semRoutineInTemplBody(c: var TemplCtx, n: PNode, k: TSymKind): PNode = for i in patternPos..miscPos: n.sons[i] = semTemplBody(c, n.sons[i]) # open scope for locals + inc c.scopeN openScope(c) n.sons[bodyPos] = semTemplBody(c, n.sons[bodyPos]) # close scope for locals closeScope(c) + dec c.scopeN # close scope for parameters closeScope(c) @@ -346,7 +345,8 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode = of nkBindStmt: result = semBindStmt(c.c, n, c.toBind) of nkMixinStmt: - result = semMixinStmt(c.c, n, c.toMixin) + if c.scopeN > 0: result = semTemplBodySons(c, n) + else: result = semMixinStmt(c.c, n, c.toMixin) of nkEmpty, nkSym..nkNilLit: discard of nkIfStmt: |