summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2015-08-08 14:39:32 +0200
committerAraq <rumpf_a@web.de>2015-08-08 14:48:17 +0200
commit4f8d982d5b0944f7f2bfc905c428ed81c3bd75bd (patch)
treed8b65aad7e23af1b56c77d27da3ca64f6104c680
parent06a8c377e22c32443539c807525c44548ee60883 (diff)
downloadNim-4f8d982d5b0944f7f2bfc905c428ed81c3bd75bd.tar.gz
fixes #2670
-rw-r--r--compiler/semtempl.nim23
-rw-r--r--tests/template/twhen_gensym.nim13
2 files changed, 32 insertions, 4 deletions
diff --git a/compiler/semtempl.nim b/compiler/semtempl.nim
index a138981b7..4d1eae48f 100644
--- a/compiler/semtempl.nim
+++ b/compiler/semtempl.nim
@@ -184,10 +184,25 @@ proc addLocalDecl(c: var TemplCtx, n: var PNode, k: TSymKind) =
   else:
     let ident = getIdentNode(c, n)
     if not isTemplParam(c, ident):
-      let local = newGenSym(k, ident, c)
-      addPrelimDecl(c.c, local)
-      styleCheckDef(n.info, local)
-      replaceIdentBySym(n, newSymNode(local, n.info))
+      # fix #2670, consider:
+      #
+      # when b:
+      #    var a = "hi"
+      # else:
+      #    var a = 5
+      # echo a
+      #
+      # We need to ensure that both 'a' produce the same gensym'ed symbol.
+      # So we need only check the *current* scope.
+      let s = localSearchInScope(c.c, considerQuotedIdent ident)
+      if s != nil and s.owner == c.owner and sfGenSym in s.flags:
+        styleCheckUse(n.info, s)
+        replaceIdentBySym(n, newSymNode(s, n.info))
+      else:
+        let local = newGenSym(k, ident, c)
+        addPrelimDecl(c.c, local)
+        styleCheckDef(n.info, local)
+        replaceIdentBySym(n, newSymNode(local, n.info))
     else:
       replaceIdentBySym(n, ident)
 
diff --git a/tests/template/twhen_gensym.nim b/tests/template/twhen_gensym.nim
new file mode 100644
index 000000000..d84ee6f03
--- /dev/null
+++ b/tests/template/twhen_gensym.nim
@@ -0,0 +1,13 @@
+discard """
+  output: "hi"
+"""
+
+# bug #2670
+template testTemplate(b: bool): stmt =
+    when b:
+        var a = "hi"
+    else:
+        var a = 5
+    echo a
+
+testTemplate(true)