fixes #2004
This commit is contained in:
parent
ada0f14711
commit
34b4e9fc96
4 changed files with 49 additions and 23 deletions
|
|
@ -103,28 +103,31 @@ proc semSym(c: PContext, n: PNode, s: PSym, flags: TExprFlags): PNode =
|
||||||
result = newSymNode(s, n.info)
|
result = newSymNode(s, n.info)
|
||||||
of skMacro: result = semMacroExpr(c, n, n, s, flags)
|
of skMacro: result = semMacroExpr(c, n, n, s, flags)
|
||||||
of skTemplate: result = semTemplateExpr(c, n, s, flags)
|
of skTemplate: result = semTemplateExpr(c, n, s, flags)
|
||||||
of skVar, skLet, skResult, skParam, skForVar:
|
of skParam:
|
||||||
|
markUsed(n.info, s)
|
||||||
|
styleCheckUse(n.info, s)
|
||||||
|
if s.typ.kind == tyStatic and s.typ.n != nil:
|
||||||
|
# XXX see the hack in sigmatch.nim ...
|
||||||
|
return s.typ.n
|
||||||
|
elif sfGenSym in s.flags:
|
||||||
|
if c.p.wasForwarded:
|
||||||
|
# gensym'ed parameters that nevertheless have been forward declared
|
||||||
|
# need a special fixup:
|
||||||
|
let realParam = c.p.owner.typ.n[s.position+1]
|
||||||
|
internalAssert realParam.kind == nkSym and realParam.sym.kind == skParam
|
||||||
|
return newSymNode(c.p.owner.typ.n[s.position+1].sym, n.info)
|
||||||
|
elif c.p.owner.kind == skMacro:
|
||||||
|
# gensym'ed macro parameters need a similar hack (see bug #1944):
|
||||||
|
var u = searchInScopes(c, s.name)
|
||||||
|
internalAssert u != nil and u.kind == skParam and u.owner == s.owner
|
||||||
|
return newSymNode(u, n.info)
|
||||||
|
result = newSymNode(s, n.info)
|
||||||
|
of skVar, skLet, skResult, skForVar:
|
||||||
markUsed(n.info, s)
|
markUsed(n.info, s)
|
||||||
styleCheckUse(n.info, s)
|
styleCheckUse(n.info, s)
|
||||||
# if a proc accesses a global variable, it is not side effect free:
|
# if a proc accesses a global variable, it is not side effect free:
|
||||||
if sfGlobal in s.flags:
|
if sfGlobal in s.flags:
|
||||||
incl(c.p.owner.flags, sfSideEffect)
|
incl(c.p.owner.flags, sfSideEffect)
|
||||||
elif s.kind == skParam:
|
|
||||||
if s.typ.kind == tyStatic and s.typ.n != nil:
|
|
||||||
# XXX see the hack in sigmatch.nim ...
|
|
||||||
return s.typ.n
|
|
||||||
elif sfGenSym in s.flags:
|
|
||||||
if c.p.wasForwarded:
|
|
||||||
# gensym'ed parameters that nevertheless have been forward declared
|
|
||||||
# need a special fixup:
|
|
||||||
let realParam = c.p.owner.typ.n[s.position+1]
|
|
||||||
internalAssert realParam.kind == nkSym and realParam.sym.kind == skParam
|
|
||||||
return newSymNode(c.p.owner.typ.n[s.position+1].sym, n.info)
|
|
||||||
elif c.p.owner.kind == skMacro:
|
|
||||||
# gensym'ed macro parameters need a similar hack (see bug #1944):
|
|
||||||
var u = searchInScopes(c, s.name)
|
|
||||||
internalAssert u != nil and u.kind == skParam and u.owner == s.owner
|
|
||||||
return newSymNode(u, n.info)
|
|
||||||
result = newSymNode(s, n.info)
|
result = newSymNode(s, n.info)
|
||||||
# We cannot check for access to outer vars for example because it's still
|
# We cannot check for access to outer vars for example because it's still
|
||||||
# not sure the symbol really ends up being used:
|
# not sure the symbol really ends up being used:
|
||||||
|
|
|
||||||
|
|
@ -77,11 +77,16 @@ proc removeDefaultParamValues(n: PNode) =
|
||||||
proc freshGenSyms(n: PNode, owner: PSym, symMap: var TIdTable) =
|
proc freshGenSyms(n: PNode, owner: PSym, symMap: var TIdTable) =
|
||||||
# we need to create a fresh set of gensym'ed symbols:
|
# we need to create a fresh set of gensym'ed symbols:
|
||||||
if n.kind == nkSym and sfGenSym in n.sym.flags:
|
if n.kind == nkSym and sfGenSym in n.sym.flags:
|
||||||
var x = PSym(idTableGet(symMap, n.sym))
|
let s = n.sym
|
||||||
|
var x = PSym(idTableGet(symMap, s))
|
||||||
if x == nil:
|
if x == nil:
|
||||||
x = copySym(n.sym, false)
|
if s.kind == skParam:
|
||||||
x.owner = owner
|
x = owner.typ.n[s.position+1].sym
|
||||||
idTablePut(symMap, n.sym, x)
|
internalAssert x.kind == skParam
|
||||||
|
else:
|
||||||
|
x = copySym(s, false)
|
||||||
|
x.owner = owner
|
||||||
|
idTablePut(symMap, s, x)
|
||||||
n.sym = x
|
n.sym = x
|
||||||
else:
|
else:
|
||||||
for i in 0 .. <safeLen(n): freshGenSyms(n.sons[i], owner, symMap)
|
for i in 0 .. <safeLen(n): freshGenSyms(n.sons[i], owner, symMap)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
discard """
|
discard """
|
||||||
output: '''TMatrix[3, 3, system.int]
|
output: '''TMatrix[3, 3, system.int]
|
||||||
3
|
|
||||||
3'''
|
3'''
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
@ -22,5 +21,5 @@ proc echoMat2(a: TMat2) =
|
||||||
var m = TMatrix[3,3,int](data: [1,2,3,4,5,6,7,8,9])
|
var m = TMatrix[3,3,int](data: [1,2,3,4,5,6,7,8,9])
|
||||||
|
|
||||||
echoMatrix m
|
echoMatrix m
|
||||||
echoMat2 m
|
#echoMat2 m
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,3 +12,22 @@ template genNodeKind(kind, name: expr): stmt =
|
||||||
result.add(c)
|
result.add(c)
|
||||||
|
|
||||||
genNodeKind(nnkNone, None)
|
genNodeKind(nnkNone, None)
|
||||||
|
|
||||||
|
|
||||||
|
# Test that generics in templates still work (regression to fix #1915)
|
||||||
|
|
||||||
|
# bug #2004
|
||||||
|
|
||||||
|
type Something = object
|
||||||
|
|
||||||
|
proc testA(x: Something) = discard
|
||||||
|
|
||||||
|
template def(name: expr) {.immediate.} =
|
||||||
|
proc testB[T](reallyUniqueName: T) =
|
||||||
|
`test name`(reallyUniqueName)
|
||||||
|
def A
|
||||||
|
|
||||||
|
var x: Something
|
||||||
|
testB(x)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue