shithub: mc

Download patch

ref: 274de043f67e79f1582d25a998fbf67b092fd60d
parent: f1e8c8cd310958e8203f4e3753a53141971a7466
author: Ori Bernstein <[email protected]>
date: Sat Dec 20 16:48:16 EST 2014

Improve error reporting.

    Double declarations now say where they were double declared.

--- a/parse/dump.c
+++ b/parse/dump.c
@@ -113,7 +113,7 @@
         findentf(fd, depth, "Nil\n");
         return;
     }
-    findentf(fd, depth, "%s.%zd@%i", nodestr(n->type), n->nid, n->loc.line);
+    findentf(fd, depth, "%s.%zd@%i", nodestr(n->type), n->nid, lnum(n->loc));
     switch(n->type) {
         case Nfile:
             fprintf(fd, "(name = %s)\n", n->file.files[0]);
--- a/parse/node.c
+++ b/parse/node.c
@@ -18,6 +18,16 @@
 Node **exportimpls;
 size_t nexportimpls;
 
+char *fname(Srcloc l)
+{
+    return file->file.files[l.file];
+}
+
+int lnum(Srcloc l)
+{
+    return l.line;
+}
+
 Node *mknode(Srcloc loc, Ntype nt)
 {
     Node *n;
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -172,6 +172,7 @@
 
 struct Trait {
     int uid;            /* unique id */
+    Srcloc loc;
     Vis vis;
     int isproto;        /* is it a prototype (for exporting purposes) */
     int ishidden;       /* should user code be able to use this? */
@@ -414,6 +415,8 @@
 int nameeq(void *a, void *b);
 
 /* util functions */
+char *fname(Srcloc l);
+int lnum(Srcloc l);
 void *zalloc(size_t size);
 void *xalloc(size_t size);
 void *zrealloc(void *p, size_t oldsz, size_t size);
--- a/parse/stab.c
+++ b/parse/stab.c
@@ -221,13 +221,13 @@
     old->decl.vis = Visexport;
 
     if (e->decl.init && g->decl.init)
-        fatal(e, "export %s double initialized on line %d", declname(e), g->loc.line);
+        fatal(e, "export %s double initialized on %s:%d", declname(e), fname(g->loc), lnum(g->loc));
     if (e->decl.isgeneric != g->decl.isgeneric)
-        fatal(e, "export %s declared with different genericness on line %d", declname(e), g->loc.line);
+        fatal(e, "export %s declared with different genericness on %s:%d", declname(e), fname(g->loc), lnum(g->loc));
     if (e->decl.isconst != g->decl.isconst)
-        fatal(e, "export %s declared with different constness on line %d", declname(e), g->loc.line);
+        fatal(e, "export %s declared with different constness on %s:%d", declname(e), fname(g->loc), lnum(g->loc));
     if (e->decl.isconst != g->decl.isconst)
-        fatal(e, "export %s declared with different externness on line %d", declname(e), g->loc.line);
+        fatal(e, "export %s declared with different externness on %s:%d", declname(e), fname(g->loc), lnum(g->loc));
 
     if (new->decl.name->name.ns)
         setns(old->decl.name, new->decl.name->name.ns);
@@ -259,7 +259,7 @@
     if (!old)
         forcedcl(st, s);
     else if (!mergedecl(old, s))
-        fatal(s, "%s already declared on line %d", namestr(s->decl.name), old->loc.line);
+        fatal(old, "%s already declared on %s:%d", namestr(s->decl.name), fname(s->loc), lnum(s->loc));
 }
 
 void forcedcl (Stab *st, Node *s) {
@@ -320,14 +320,18 @@
             htput(st->ty, td->name, td);
         }
     } else if (!mergetype(ty, t)) {
-        fatal(n, "Type %s already defined", tystr(gettype(st, n)));
+        fatal(n, "Type %s already declared on %s:%d", tystr(ty), fname(ty->loc), lnum(ty->loc));
     }
 }
 
 void putucon(Stab *st, Ucon *uc)
 {
-    if (getucon(st, uc->name))
-        lfatal(uc->loc, "union constructor %s already defined", namestr(uc->name));
+    Ucon *old;
+
+
+    old = getucon(st, uc->name);
+    if (old)
+        lfatal(old->loc, "`%s already defined on %s:%d", namestr(uc->name), fname(uc->loc), lnum(uc->loc));
     htput(st->uc, uc->name, uc);
 }
 
@@ -346,12 +350,14 @@
 {
     Traitdefn *td;
     Trait *t;
+    Type *ty;
 
     t = gettrait(st, n);
     if (t && !mergetrait(t, c))
-        fatal(n, "Trait %s already defined", namestr(n));
-    if (gettype(st, n))
-        fatal(n, "Trait %s already defined as a type", namestr(n));
+        fatal(n, "Trait %s already defined on %s:%d", namestr(n), fname(t->loc), lnum(t->loc));
+    ty = gettype(st, n);
+    if (ty)
+        fatal(n, "Trait %s defined as a type on %s:%d", namestr(n), fname(ty->loc), lnum(ty->loc));
     td = xalloc(sizeof(Traitdefn));
     td->loc = n->loc;
     td->name = n;
@@ -376,7 +382,9 @@
 
     impl = getimpl(st, n);
     if (impl && !mergeimpl(impl, n))
-        fatal(n, "Trait %s already implemented over %s", namestr(n->impl.traitname), tystr(n->impl.type));
+        fatal(n, "Trait %s already implemented over %s at %s:%d",
+              namestr(n->impl.traitname), tystr(n->impl.type),
+              fname(n->loc), lnum(n->loc));
     if (st->name)
         setns(n->impl.traitname, namestr(st->name));
     htput(st->impl, n, n);
@@ -400,7 +408,7 @@
 
     s = getns(st, scope->name);
     if (s)
-        fatal(scope->name, "Ns %s already defined", namestr(s->name));
+        fatal(scope->name, "Namespace %s already defined at %s:%d", namestr(s->name), fname(s->name->loc), lnum(s->name->loc));
     htput(st->ns, namestr(scope->name), scope);
 }
 
--- a/parse/type.c
+++ b/parse/type.c
@@ -116,6 +116,7 @@
     Trait *t;
 
     t = zalloc(sizeof(Trait));
+    t->loc = loc;
     t->vis = Visintern;
     t->name = name;
     t->param = param;