fix the filtering of void params in procs' signatures
This commit is contained in:
parent
afddae5aaf
commit
723efe7cfb
5 changed files with 28 additions and 34 deletions
|
|
@ -189,14 +189,32 @@ 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
|
||||||
if newbody.isGenericAlias: newbody = newbody.skipGenericAlias
|
if newbody.isGenericAlias: newbody = newbody.skipGenericAlias
|
||||||
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 =
|
||||||
|
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
# Module A
|
|
||||||
var
|
|
||||||
lastId = 0
|
|
||||||
|
|
||||||
template genId*: expr =
|
|
||||||
inc(lastId)
|
|
||||||
lastId
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -5,23 +5,23 @@ discard """
|
||||||
|
|
||||||
import tables
|
import tables
|
||||||
|
|
||||||
proc action1(arg: string) =
|
proc action1(arg: string) =
|
||||||
echo "action 1 ", arg
|
echo "action 1 ", arg
|
||||||
|
|
||||||
proc action2(arg: string) =
|
proc action2(arg: string) =
|
||||||
echo "action 2 ", arg
|
echo "action 2 ", arg
|
||||||
|
|
||||||
proc action3(arg: string) =
|
proc action3(arg: string) =
|
||||||
echo "action 3 ", arg
|
echo "action 3 ", arg
|
||||||
|
|
||||||
proc action4(arg: string) =
|
proc action4(arg: string) =
|
||||||
echo "action 4 ", arg
|
echo "action 4 ", arg
|
||||||
|
|
||||||
const
|
const
|
||||||
actionTable = {
|
actionTable = {
|
||||||
"A": action1,
|
"A": action1,
|
||||||
"B": action2,
|
"B": action2,
|
||||||
"C": action3,
|
"C": action3,
|
||||||
"D": action4}.toTable
|
"D": action4}.toTable
|
||||||
|
|
||||||
actionTable["C"]("arg")
|
actionTable["C"]("arg")
|
||||||
|
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
discard """
|
|
||||||
file: "mbind4.nim"
|
|
||||||
line: 6
|
|
||||||
errormsg: "undeclared identifier: \'lastId\'"
|
|
||||||
"""
|
|
||||||
# Module B
|
|
||||||
import mbind4
|
|
||||||
|
|
||||||
echo genId()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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"
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue