summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOri Bernstein <ori@eigenstate.org>2018-01-14 19:21:58 -0800
committerOri Bernstein <ori@eigenstate.org>2018-01-14 19:21:58 -0800
commitac6c06f906d356b0004ed450558dd890c7057fbf (patch)
tree5a1c7f9569246835f820fded51a10be917a2943f
parent9d5831fb236f42fe126160c339a70452ef0fa460 (diff)
downloadmc-ac6c06f906d356b0004ed450558dd890c7057fbf.tar.gz
Fix binding of type env in traits.
-rw-r--r--parse/infer.c4
-rw-r--r--parse/node.c3
2 files changed, 5 insertions, 2 deletions
diff --git a/parse/infer.c b/parse/infer.c
index 4298eed..daa071e 100644
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -1930,7 +1930,7 @@ specializeimpl(Node *n)
fatal(n, "%s incompatibly specialized with %zd types instead of %zd types",
namestr(n->impl.traitname), n->impl.naux, tr->naux);
n->impl.type = tf(n->impl.type);
- pushenv(n->impl.type->env);
+ pushenv(n->impl.env);
for (i = 0; i < n->impl.naux; i++)
n->impl.aux[i] = tf(n->impl.aux[i]);
for (i = 0; i < n->impl.ndecls; i++) {
@@ -1997,7 +1997,7 @@ specializeimpl(Node *n)
if (generic)
ingeneric--;
}
- popenv(n->impl.type->env);
+ popenv(n->impl.env);
}
static void
diff --git a/parse/node.c b/parse/node.c
index 6e9a8ce..e4332f9 100644
--- a/parse/node.c
+++ b/parse/node.c
@@ -264,6 +264,9 @@ mkimplstmt(Srcloc loc, Node *name, Type *t, Type **aux, size_t naux, Node **decl
n->impl.env = mkenv();
bindtype(n->impl.env, t);
}
+ for (i = 0; i < naux; i++)
+ if (hasparams(aux[i]))
+ bindtype(n->impl.env, aux[i]);
return n;
}