diff --git a/ghc/interpreter/static.c b/ghc/interpreter/static.c index 6892f425164109e32095d276f81d5c6fc05eab38..7636dd7f37d39753294ecc5774a0995343516313 100644 --- a/ghc/interpreter/static.c +++ b/ghc/interpreter/static.c @@ -9,8 +9,8 @@ * included in the distribution. * * $RCSfile: static.c,v $ - * $Revision: 1.41 $ - * $Date: 2000/05/17 22:05:44 $ + * $Revision: 1.42 $ + * $Date: 2000/06/02 16:19:47 $ * ------------------------------------------------------------------------*/ #include "hugsbasictypes.h" @@ -1322,6 +1322,10 @@ Class c; { } } + /* add in the tyvars from the `supers' so that we don't + prematurely complain about undefined tyvars */ + tyvars = typeVarsIn(cclass(c).supers,NIL,NIL,tyvars); + if (cclass(c).arity==0) { cclass(c).head = c; } else { @@ -1335,6 +1339,23 @@ Class c; { tcDeps = NIL; /* find dependents */ map2Over(depPredExp,cclass(c).line,tyvars,cclass(c).supers); + + { /* depPredExp instantiates class names to class structs, so + * now we have enough info to check for ambiguity + */ + List tvts = offsetTyvarsIn(cclass(c).head,NIL); + List tvps = offsetTyvarsIn(cclass(c).supers,NIL); + List fds = calcFunDeps(cclass(c).supers); + tvts = oclose(fds,tvts); + tvts = odiff(tvps,tvts); + + if (!isNull(tvts)) { + ERRMSG(cclass(c).line) "Undefined type variable \"%s\"", + textToStr(textOf(nth(offsetOf(hd(tvts)),tyvars))) + EEND; + } + } + h98CheckCtxt(cclass(c).line,"class definition",FALSE,cclass(c).supers,NIL); cclass(c).numSupers = length(cclass(c).supers); cclass(c).defaults = extractBindings(cclass(c).members); /* defaults*/