diff options
-rw-r--r-- | compiler/evaltempl.nim | 2 | ||||
-rw-r--r-- | tests/template/tparams_gensymed.nim | 20 |
2 files changed, 21 insertions, 1 deletions
diff --git a/compiler/evaltempl.nim b/compiler/evaltempl.nim index 14388367a..9cc9ffc28 100644 --- a/compiler/evaltempl.nim +++ b/compiler/evaltempl.nim @@ -37,7 +37,7 @@ proc evalTemplateAux(templ, actual: PNode, c: var TemplCtx, result: PNode) = case templ.kind of nkSym: var s = templ.sym - if s.owner == nil or s.owner.id == c.owner.id: + if (s.owner == nil and s.kind == skParam) or s.owner == c.owner: if s.kind == skParam and sfGenSym notin s.flags: handleParam actual.sons[s.position] elif (s.owner != nil) and (s.kind == skGenericParam or diff --git a/tests/template/tparams_gensymed.nim b/tests/template/tparams_gensymed.nim index 91fa26596..b19ed7afc 100644 --- a/tests/template/tparams_gensymed.nim +++ b/tests/template/tparams_gensymed.nim @@ -110,3 +110,23 @@ implementUnary(): x*x registerInstantiation(int) registerInstantiation(float) + +# bug #10192 +template nest(body) {.dirty.} = + template p1(b1: untyped) {.dirty, used.} = + template implp1: untyped {.dirty.} = b1 + template p2(b2: untyped) {.dirty, used.} = + template implp2: untyped {.dirty.} = b2 + + body + implp1 + implp2 + +template test() = + nest: + p1: + var foo = "bar" + p2: + doAssert(foo.len == 3) + +test() |