diff options
author | Araq <rumpf_a@web.de> | 2015-08-08 14:39:32 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2015-08-08 14:48:17 +0200 |
commit | 4f8d982d5b0944f7f2bfc905c428ed81c3bd75bd (patch) | |
tree | d8b65aad7e23af1b56c77d27da3ca64f6104c680 /compiler | |
parent | 06a8c377e22c32443539c807525c44548ee60883 (diff) | |
download | Nim-4f8d982d5b0944f7f2bfc905c428ed81c3bd75bd.tar.gz |
fixes #2670
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/semtempl.nim | 23 |
1 files changed, 19 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) |