summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'compiler')
-rw-r--r--compiler/ccgtrav.nim3
-rw-r--r--compiler/renderer.nim6
-rw-r--r--compiler/semexprs.nim4
-rw-r--r--compiler/semtempl.nim8
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: