summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorZahary Karadjov <zahary@gmail.com>2013-12-29 19:26:52 +0200
committerZahary Karadjov <zahary@gmail.com>2013-12-29 19:26:52 +0200
commit723efe7cfb6cb6ea4147cb5ba407ad3f39ac9032 (patch)
tree80a463351a20e4b7d7e571fb0193b6ddc530adca /compiler
parentafddae5aaf08a3a3357ec33d0bc82bdba0f5dc08 (diff)
downloadNim-723efe7cfb6cb6ea4147cb5ba407ad3f39ac9032.tar.gz
fix the filtering of void params in procs' signatures
Diffstat (limited to 'compiler')
-rw-r--r--compiler/semtypinst.nim24
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 =