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 | |
parent | 06a8c377e22c32443539c807525c44548ee60883 (diff) | |
download | Nim-4f8d982d5b0944f7f2bfc905c428ed81c3bd75bd.tar.gz |
fixes #2670
-rw-r--r-- | compiler/semtempl.nim | 23 | ||||
-rw-r--r-- | tests/template/twhen_gensym.nim | 13 |
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) |