fix the filtering of void params in procs' signatures

This commit is contained in:
Zahary Karadjov 2013-12-29 19:26:52 +02:00
commit 723efe7cfb
5 changed files with 28 additions and 34 deletions

View file

@ -189,7 +189,6 @@ proc handleGenericInvokation(cl: var TReplTypeVars, t: PType): PType =
newbody.flags = newbody.flags + t.flags + body.flags newbody.flags = newbody.flags + t.flags + body.flags
result.flags = result.flags + newbody.flags result.flags = result.flags + newbody.flags
newbody.callConv = body.callConv newbody.callConv = body.callConv
newbody.n = replaceTypeVarsN(cl, lastSon(body).n)
# This type may be a generic alias and we want to resolve it here. # This type may be a generic alias and we want to resolve it here.
# One step is enough, because the recursive nature of # One step is enough, because the recursive nature of
# handleGenericInvokation will handle the alias-to-alias-to-alias case # handleGenericInvokation will handle the alias-to-alias-to-alias case
@ -197,6 +196,25 @@ proc handleGenericInvokation(cl: var TReplTypeVars, t: PType): PType =
rawAddSon(result, newbody) rawAddSon(result, newbody)
checkPartialConstructedType(cl.info, newbody) checkPartialConstructedType(cl.info, newbody)
proc normalizeProcType(t: PType) =
if t.sons[0] != nil and t.sons[0].kind == tyEmpty:
t.sons[0] = nil
for i in 1 .. <t.sonsLen:
if t.sons[i].kind == tyEmpty:
# the nested loops are here in order to avoid
# touching any memory and callign setLen unless
# it's really necessary
var pos = i
for j in i+1 .. <t.sonsLen:
if t.sons[j].kind != tyEmpty:
t.sons[pos] = t.sons[j]
t.n.sons[pos] = t.n.sons[j]
inc pos
setLen t.sons, pos
setLen t.n.sons, pos
return
proc replaceTypeVarsT*(cl: var TReplTypeVars, t: PType): PType = proc replaceTypeVarsT*(cl: var TReplTypeVars, t: PType): PType =
result = t result = t
if t == nil: return if t == nil: return
@ -244,9 +262,7 @@ proc replaceTypeVarsT*(cl: var TReplTypeVars, t: PType): PType =
result.n = replaceTypeVarsN(cl, result.n) result.n = replaceTypeVarsN(cl, result.n)
if result.kind in GenericTypes: if result.kind in GenericTypes:
localError(cl.info, errCannotInstantiateX, typeToString(t, preferName)) localError(cl.info, errCannotInstantiateX, typeToString(t, preferName))
if result.kind == tyProc and result.sons[0] != nil: if result.kind == tyProc: normalizeProcType(result)
if result.sons[0].kind == tyEmpty:
result.sons[0] = nil
proc generateTypeInstance*(p: PContext, pt: TIdTable, info: TLineInfo, proc generateTypeInstance*(p: PContext, pt: TIdTable, info: TLineInfo,
t: PType): PType = t: PType): PType =

View file

@ -1,9 +0,0 @@
# Module A
var
lastId = 0
template genId*: expr =
inc(lastId)
lastId

View file

@ -1,13 +0,0 @@
discard """
file: "mbind4.nim"
line: 6
errormsg: "undeclared identifier: \'lastId\'"
"""
# Module B
import mbind4
echo genId()

View file

@ -1,5 +1,5 @@
discard """ discard """
line: 1840 line: 1847
file: "system.nim" file: "system.nim"
errormsg: "can raise an unlisted exception: ref EIO" errormsg: "can raise an unlisted exception: ref EIO"
""" """