diff options
author | Zahary Karadjov <zahary@gmail.com> | 2013-12-29 19:26:52 +0200 |
---|---|---|
committer | Zahary Karadjov <zahary@gmail.com> | 2013-12-29 19:26:52 +0200 |
commit | 723efe7cfb6cb6ea4147cb5ba407ad3f39ac9032 (patch) | |
tree | 80a463351a20e4b7d7e571fb0193b6ddc530adca /compiler | |
parent | afddae5aaf08a3a3357ec33d0bc82bdba0f5dc08 (diff) | |
download | Nim-723efe7cfb6cb6ea4147cb5ba407ad3f39ac9032.tar.gz |
fix the filtering of void params in procs' signatures
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/semtypinst.nim | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/compiler/semtypinst.nim b/compiler/semtypinst.nim index 0bb27946f..04d257707 100644 --- a/compiler/semtypinst.nim +++ b/compiler/semtypinst.nim @@ -189,14 +189,32 @@ proc handleGenericInvokation(cl: var TReplTypeVars, t: PType): PType = newbody.flags = newbody.flags + t.flags + body.flags result.flags = result.flags + newbody.flags 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. # One step is enough, because the recursive nature of # handleGenericInvokation will handle the alias-to-alias-to-alias case if newbody.isGenericAlias: newbody = newbody.skipGenericAlias rawAddSon(result, 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 = result = t if t == nil: return @@ -244,9 +262,7 @@ proc replaceTypeVarsT*(cl: var TReplTypeVars, t: PType): PType = result.n = replaceTypeVarsN(cl, result.n) if result.kind in GenericTypes: localError(cl.info, errCannotInstantiateX, typeToString(t, preferName)) - if result.kind == tyProc and result.sons[0] != nil: - if result.sons[0].kind == tyEmpty: - result.sons[0] = nil + if result.kind == tyProc: normalizeProcType(result) proc generateTypeInstance*(p: PContext, pt: TIdTable, info: TLineInfo, t: PType): PType = |