This commit is contained in:
Araq 2017-03-06 18:38:15 +01:00
commit 4a77b66b19
2 changed files with 26 additions and 4 deletions

View file

@ -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:

View 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