* included in the distribution.
*
* $RCSfile: static.c,v $
- * $Revision: 1.37 $
- * $Date: 2000/04/05 14:14:51 $
+ * $Revision: 1.42 $
+ * $Date: 2000/06/02 16:19:47 $
* ------------------------------------------------------------------------*/
#include "hugsbasictypes.h"
static List local checkExportTycon ( List,Text,Cell,Tycon );
static List local checkExportClass ( List,Text,Cell,Class );
static List local checkExport ( List,Text,Cell );
-static List local checkImportEntity ( List,Module,Bool,Cell );
-static List local resolveImportList ( Module,Cell,Bool );
+static List local checkImportEntity ( List,Module,Cell );
+static List local resolveImportList ( Module,Cell );
static Void local checkImportList ( Pair );
static Void local importEntity ( Module,Cell );
return imports;
}
-static List local checkImportEntity(imports,exporter,priv,entity)
+static List local checkImportEntity(imports,exporter,entity)
List imports; /* Accumulated list of things to import */
Module exporter;
-Bool priv;
Cell entity; { /* Entry from import list */
List oldImports = imports;
Text t = isIdent(entity) ? textOf(entity) : textOf(fst(entity));
List es = NIL;
- if (priv) {
- es = module(exporter).names;
- es = dupOnto(module(exporter).tycons,es);
- es = dupOnto(module(exporter).classes,es);
- } else {
- es = module(exporter).exports;
- }
+ es = module(exporter).exports;
for(; nonNull(es); es=tl(es)) {
Cell e = hd(es); /* :: Entity
if (isIdent(entity) && name(e).text == t) {
imports = cons(e,imports);
}
- } else if (isTycon(e) && priv) {
- if (tycon(e).text == t) {
- imports = cons(e,imports);
- return dupOnto(tycon(e).defn,imports);
- }
- } else if (isClass(e) && priv) {
- if (cclass(e).text == t) {
- imports = cons(e,imports);
- return dupOnto(cclass(e).members,imports);
- }
- } else if (whatIs(e) == TUPLE && priv) {
- // do nothing
} else {
internal("checkImportEntity3");
}
return imports;
}
-static List local resolveImportList(m,impList,priv)
+static List local resolveImportList(m,impList)
Module m; /* exporting module */
-Cell impList;
-Bool priv; {
+Cell impList; {
List imports = NIL;
if (DOTDOT == impList) {
List es = module(m).exports;
}
}
} else {
- map2Accum(checkImportEntity,imports,m,priv,impList);
+ map1Accum(checkImportEntity,imports,m,impList);
}
return imports;
}
/* Somewhat inefficient - but obviously correct:
* imports = importsOf("module Foo") `setDifference` hidden;
*/
- hidden = resolveImportList(m, snd(impList),FALSE);
- imports = resolveImportList(m, DOTDOT,FALSE);
- } else if (isPair(impList) && STAR == fst(impList)) {
- // Previously, I was forcing an import Prelude,
- // but this precluded doing things like
- // import Prelude hiding ( catch)
- // so, for now, you need to put an explicit
- // import Prelude if you use import privileged.
- imports = resolveImportList(m, snd(impList),TRUE);
+ hidden = resolveImportList(m, snd(impList));
+ imports = resolveImportList(m, DOTDOT);
} else {
- imports = resolveImportList(m, impList,FALSE);
+ imports = resolveImportList(m, impList);
}
for(; nonNull(imports); imports=tl(imports)) {
}
}
+ /* 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 {
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*/
thd3(m) = t; /* Save type */
take(cclass(c).arity,tyvars); /* Delete extra type vars */
- if (isAmbiguous(t)) {
- ambigError(line,"class declaration",hd(vs),t);
- }
h98CheckType(line,"member type",hd(vs),t);
}
Int line = intOf(fst3(m));
List vs = snd3(m);
Type t = thd3(m);
+
+ if (isAmbiguous(t)) {
+ ambigError(line,"class declaration",hd(vs),t);
+ }
}
static Void local addMembers(c) /* Add definitions of member funs */
Cell type; {
Text t = textOf(intName);
Name n = findName(t);
- Int l = intOf(line);
if (isNull(n)) {
n = newName(t,NIL);
} else if (name(n).defn!=PREDEFINED) {
- ERRMSG(l) "Redeclaration of foreign \"%s\"", textToStr(t)
+ ERRMSG(line) "Redeclaration of foreign \"%s\"", textToStr(t)
EEND;
}
- name(n).line = l;
+ name(n).line = line;
name(n).defn = extName;
name(n).type = type;
name(n).callconv = callconv;
Cell type; {
Text t = textOf(intName);
Name n = findName(t);
- Int l = intOf(line);
if (isNull(n)) {
n = newName(t,NIL);
} else if (name(n).defn!=PREDEFINED) {
- ERRMSG(l) "Redeclaration of foreign \"%s\"", textToStr(t)
+ ERRMSG(line) "Redeclaration of foreign \"%s\"", textToStr(t)
EEND;
}
- name(n).line = l;
+ name(n).line = line;
name(n).defn = NIL; /* nothing to say */
name(n).type = type;
name(n).callconv = callconv;
mapProc(checkQualImport, module(thisModule).qualImports);
mapProc(checkUnqualImport,unqualImports);
/* Add "import Prelude" if there`s no explicit import */
- if (modName == textPrimPrel || modName == textPrelude) {
+ if (modName == textPrelPrim || modName == textPrelude) {
/* Nothing. */
} else if (isNull(cellAssoc(modulePrelude,unqualImports))
&& isNull(cellRevAssoc(modulePrelude,module(thisModule).qualImports))) {