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;