shithub: mc

Download patch

ref: aa736008ef9bec12e7e880f2ce60b2aa0e04260c
parent: 73b7b068a03c3d58e12cad05dea5a2008af78952
author: Ori Bernstein <[email protected]>
date: Wed Oct 3 18:00:31 EDT 2012

Make type freshening work better.

--- a/parse/infer.c
+++ b/parse/infer.c
@@ -130,12 +130,17 @@
         ret = mktyvar(t->line);
         htput(ht, t->pname, ret);
         return ret;
+    } else if (t->type == Tygeneric) {
+        for (i = 0; i < t->nparam; i++)
+            if (!hthas(ht, t->param[i]->pname))
+                htput(ht, t->param[i]->pname, mktyvar(t->param[i]->line));
+        return mktyname(t->line, t->name, tyfreshen(st, ht, t->sub[0]));
+    } else {
+        ret = tydup(t);
+        for (i = 0; i < t->nsub; i++)
+            ret->sub[i] = tyfreshen(st, ht, t->sub[i]);
+        return ret;
     }
-
-    ret = tydup(t);
-    for (i = 0; i < t->nsub; i++)
-        ret->sub[i] = tyfreshen(st, ht, t->sub[i]);
-    return ret;
 }
 
 static Type *tyspecialize(Inferstate *st, Type *t)