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)