fixes #5478
This commit is contained in:
parent
8c0e27e8d9
commit
4a77b66b19
2 changed files with 26 additions and 4 deletions
|
|
@ -144,10 +144,8 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode
|
||||||
|
|
||||||
proc openScope(c: var TemplCtx) =
|
proc openScope(c: var TemplCtx) =
|
||||||
openScope(c.c)
|
openScope(c.c)
|
||||||
inc c.scopeN
|
|
||||||
|
|
||||||
proc closeScope(c: var TemplCtx) =
|
proc closeScope(c: var TemplCtx) =
|
||||||
dec c.scopeN
|
|
||||||
closeScope(c.c)
|
closeScope(c.c)
|
||||||
|
|
||||||
proc semTemplBodyScope(c: var TemplCtx, n: PNode): PNode =
|
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)
|
result = newSym(kind, considerQuotedIdent(n), c.owner, n.info)
|
||||||
incl(result.flags, sfGenSym)
|
incl(result.flags, sfGenSym)
|
||||||
incl(result.flags, sfShadowed)
|
incl(result.flags, sfShadowed)
|
||||||
#if c.scopeN == 0: incl(result.flags, sfFromGeneric)
|
|
||||||
|
|
||||||
proc addLocalDecl(c: var TemplCtx, n: var PNode, k: TSymKind) =
|
proc addLocalDecl(c: var TemplCtx, n: var PNode, k: TSymKind) =
|
||||||
# locals default to 'gensym':
|
# locals default to 'gensym':
|
||||||
|
|
@ -275,10 +272,12 @@ proc semRoutineInTemplBody(c: var TemplCtx, n: PNode, k: TSymKind): PNode =
|
||||||
for i in patternPos..miscPos:
|
for i in patternPos..miscPos:
|
||||||
n.sons[i] = semTemplBody(c, n.sons[i])
|
n.sons[i] = semTemplBody(c, n.sons[i])
|
||||||
# open scope for locals
|
# open scope for locals
|
||||||
|
inc c.scopeN
|
||||||
openScope(c)
|
openScope(c)
|
||||||
n.sons[bodyPos] = semTemplBody(c, n.sons[bodyPos])
|
n.sons[bodyPos] = semTemplBody(c, n.sons[bodyPos])
|
||||||
# close scope for locals
|
# close scope for locals
|
||||||
closeScope(c)
|
closeScope(c)
|
||||||
|
dec c.scopeN
|
||||||
# close scope for parameters
|
# close scope for parameters
|
||||||
closeScope(c)
|
closeScope(c)
|
||||||
|
|
||||||
|
|
@ -346,7 +345,8 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode =
|
||||||
of nkBindStmt:
|
of nkBindStmt:
|
||||||
result = semBindStmt(c.c, n, c.toBind)
|
result = semBindStmt(c.c, n, c.toBind)
|
||||||
of nkMixinStmt:
|
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:
|
of nkEmpty, nkSym..nkNilLit:
|
||||||
discard
|
discard
|
||||||
of nkIfStmt:
|
of nkIfStmt:
|
||||||
|
|
|
||||||
22
tests/template/tmixin_in_proc.nim
Normal file
22
tests/template/tmixin_in_proc.nim
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
discard """
|
||||||
|
output: '''monkey'''
|
||||||
|
"""
|
||||||
|
# bug #5478
|
||||||
|
template creature*(name: untyped) =
|
||||||
|
type
|
||||||
|
name*[T] = object
|
||||||
|
color: T
|
||||||
|
|
||||||
|
proc `init name`*[T](c: T): name[T] =
|
||||||
|
mixin transform
|
||||||
|
transform()
|
||||||
|
|
||||||
|
creature(Lion)
|
||||||
|
|
||||||
|
type Monkey* = object
|
||||||
|
proc transform*() =
|
||||||
|
echo "monkey"
|
||||||
|
|
||||||
|
var
|
||||||
|
m: Monkey
|
||||||
|
y = initLion(m) #this one failed to compile
|
||||||
Loading…
Add table
Add a link
Reference in a new issue