summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/semtypinst.nim24
-rw-r--r--tests/reject/mbind4.nim9
-rw-r--r--tests/reject/tactiontable2.nim14
-rw-r--r--tests/reject/tbind4.nim13
-rw-r--r--tests/reject/teffects1.nim2
5 files changed, 28 insertions, 34 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 =
diff --git a/tests/reject/mbind4.nim b/tests/reject/mbind4.nim
deleted file mode 100644
index 53b8331cd..000000000
--- a/tests/reject/mbind4.nim
+++ /dev/null
@@ -1,9 +0,0 @@
-# Module A
-var 
-  lastId = 0
-
-template genId*: expr =
-  inc(lastId)
-  lastId
-
-
diff --git a/tests/reject/tactiontable2.nim b/tests/reject/tactiontable2.nim
index dbfa42f18..00b427603 100644
--- a/tests/reject/tactiontable2.nim
+++ b/tests/reject/tactiontable2.nim
@@ -5,23 +5,23 @@ discard """
 
 import tables
 
-proc action1(arg: string) = 
+proc action1(arg: string) =
   echo "action 1 ", arg
 
-proc action2(arg: string) = 
+proc action2(arg: string) =
   echo "action 2 ", arg
 
-proc action3(arg: string) = 
+proc action3(arg: string) =
   echo "action 3 ", arg
 
-proc action4(arg: string) = 
+proc action4(arg: string) =
   echo "action 4 ", arg
 
 const
   actionTable = {
-    "A": action1, 
-    "B": action2, 
-    "C": action3, 
+    "A": action1,
+    "B": action2,
+    "C": action3,
     "D": action4}.toTable
 
 actionTable["C"]("arg")
diff --git a/tests/reject/tbind4.nim b/tests/reject/tbind4.nim
deleted file mode 100644
index a0ba88e7c..000000000
--- a/tests/reject/tbind4.nim
+++ /dev/null
@@ -1,13 +0,0 @@
-discard """
-  file: "mbind4.nim"
-  line: 6
-  errormsg: "undeclared identifier: \'lastId\'"
-"""
-# Module B
-import mbind4
-
-echo genId()
-
-
-
-
diff --git a/tests/reject/teffects1.nim b/tests/reject/teffects1.nim
index f5eb56dc8..340acc6ea 100644
--- a/tests/reject/teffects1.nim
+++ b/tests/reject/teffects1.nim
@@ -1,5 +1,5 @@
 discard """
-  line: 1840
+  line: 1847
   file: "system.nim"
   errormsg: "can raise an unlisted exception: ref EIO"
 """