Commit 9475cafa authored by Russ Cox's avatar Russ Cox

gc: distinguish fatal compiler bug from error+exit

R=ken2
CC=golang-dev
https://golang.org/cl/902044
parent fe782685
...@@ -110,8 +110,10 @@ main(int argc, char *argv[]) ...@@ -110,8 +110,10 @@ main(int argc, char *argv[])
curio.infile = infile; curio.infile = infile;
curio.bin = Bopen(infile, OREAD); curio.bin = Bopen(infile, OREAD);
if(curio.bin == nil) if(curio.bin == nil) {
fatal("open %s: %r", infile); print("open %s: %r\n", infile);
errorexit();
}
curio.peekc = 0; curio.peekc = 0;
curio.peekc1 = 0; curio.peekc1 = 0;
curio.nlsemi = 0; curio.nlsemi = 0;
...@@ -300,8 +302,10 @@ importfile(Val *f, int line) ...@@ -300,8 +302,10 @@ importfile(Val *f, int line)
return; return;
} }
if(strlen(f->u.sval->s) != f->u.sval->len) if(strlen(f->u.sval->s) != f->u.sval->len) {
fatal("import path contains NUL"); yyerror("import path contains NUL");
errorexit();
}
if(strcmp(f->u.sval->s, "unsafe") == 0) { if(strcmp(f->u.sval->s, "unsafe") == 0) {
importpkg = mkpkg(f->u.sval); importpkg = mkpkg(f->u.sval);
...@@ -317,20 +321,25 @@ importfile(Val *f, int line) ...@@ -317,20 +321,25 @@ importfile(Val *f, int line)
path = strlit(cleanbuf); path = strlit(cleanbuf);
} }
if(!findpkg(path)) if(!findpkg(path)) {
fatal("can't find import: %Z", f->u.sval); yyerror("can't find import: %Z", f->u.sval);
errorexit();
}
importpkg = mkpkg(path); importpkg = mkpkg(path);
imp = Bopen(namebuf, OREAD); imp = Bopen(namebuf, OREAD);
if(imp == nil) if(imp == nil) {
fatal("can't open import: %Z", f->u.sval); yyerror("can't open import: %Z", f->u.sval);
errorexit();
}
file = strdup(namebuf); file = strdup(namebuf);
len = strlen(namebuf); len = strlen(namebuf);
if(len > 2 && namebuf[len-2] == '.' && namebuf[len-1] == 'a') { if(len > 2 && namebuf[len-2] == '.' && namebuf[len-1] == 'a') {
if(!skiptopkgdef(imp)) if(!skiptopkgdef(imp)) {
fatal("import not package file: %s", namebuf); yyerror("import not package file: %s", namebuf);
errorexit();
}
} }
// assume files move (get installed) // assume files move (get installed)
......
...@@ -12,8 +12,11 @@ void ...@@ -12,8 +12,11 @@ void
dumpobj(void) dumpobj(void)
{ {
bout = Bopen(outfile, OWRITE); bout = Bopen(outfile, OWRITE);
if(bout == nil) if(bout == nil) {
fatal("cant open %s", outfile); flusherrors();
print("can't create %s: %r\n", outfile);
errorexit();
}
Bprint(bout, "%s\n", thestring); Bprint(bout, "%s\n", thestring);
Bprint(bout, " exports automatically generated from\n"); Bprint(bout, " exports automatically generated from\n");
......
...@@ -118,8 +118,11 @@ yyerrorl(int line, char *fmt, ...) ...@@ -118,8 +118,11 @@ yyerrorl(int line, char *fmt, ...)
hcrash(); hcrash();
nerrors++; nerrors++;
if(nerrors >= 10 && !debug['e']) if(nerrors >= 10 && !debug['e']) {
fatal("too many errors"); flusherrors();
print("%L: too many errors\n", line);
errorexit();
}
} }
extern int yystate, yychar; extern int yystate, yychar;
...@@ -172,8 +175,11 @@ yyerror(char *fmt, ...) ...@@ -172,8 +175,11 @@ yyerror(char *fmt, ...)
hcrash(); hcrash();
nerrors++; nerrors++;
if(nerrors >= 10 && !debug['e']) if(nerrors >= 10 && !debug['e']) {
fatal("too many errors"); flusherrors();
print("%L: too many errors\n", parserline());
errorexit();
}
} }
void void
...@@ -195,12 +201,18 @@ fatal(char *fmt, ...) ...@@ -195,12 +201,18 @@ fatal(char *fmt, ...)
flusherrors(); flusherrors();
print("%L: fatal error: ", lineno); print("%L: internal compiler error: ", lineno);
va_start(arg, fmt); va_start(arg, fmt);
vfprint(1, fmt, arg); vfprint(1, fmt, arg);
va_end(arg); va_end(arg);
print("\n"); print("\n");
// If this is a released compiler version, ask for a bug report.
if(strncmp(getgoversion(), "release", 7) == 0) {
print("\n");
print("Please file a bug report including a short program that triggers the error.\n");
print("http://code.google.com/p/go/issues/entry?template=compilerbug");
}
hcrash(); hcrash();
errorexit(); errorexit();
} }
...@@ -3549,8 +3561,10 @@ mkpkg(Strlit *path) ...@@ -3549,8 +3561,10 @@ mkpkg(Strlit *path)
Pkg *p; Pkg *p;
int h; int h;
if(strlen(path->s) != path->len) if(strlen(path->s) != path->len) {
fatal("import path contains NUL byte"); yyerror("import path contains NUL byte");
errorexit();
}
h = stringhash(path->s) & (nelem(phash)-1); h = stringhash(path->s) & (nelem(phash)-1);
for(p=phash[h]; p; p=p->link) for(p=phash[h]; p; p=p->link)
......
...@@ -1709,7 +1709,7 @@ exportassignok(Type *t, char *desc) ...@@ -1709,7 +1709,7 @@ exportassignok(Type *t, char *desc)
prefix = " in "; prefix = " in ";
else else
desc = ""; desc = "";
yyerror("implicit assignment of %T field '%s'%s%s", t, s->name, prefix, desc); yyerror("implicit assignment of unexported field '%s' of %T%s%s", s->name, t, prefix, desc);
goto no; goto no;
} }
if(!exportassignok(f->type, desc)) if(!exportassignok(f->type, desc))
...@@ -1935,7 +1935,7 @@ typecheckcomplit(Node **np) ...@@ -1935,7 +1935,7 @@ typecheckcomplit(Node **np)
} }
s = f->sym; s = f->sym;
if(s != nil && !exportname(s->name) && s->pkg != localpkg) if(s != nil && !exportname(s->name) && s->pkg != localpkg)
yyerror("implicit assignment of %T field '%s' in struct literal", t, s->name); yyerror("implicit assignment of unexported field '%s' in %T literal", s->name, t);
ll->n = typecheckconv(nil, ll->n, f->type, 0, "field value"); ll->n = typecheckconv(nil, ll->n, f->type, 0, "field value");
ll->n = nod(OKEY, newname(f->sym), ll->n); ll->n = nod(OKEY, newname(f->sym), ll->n);
ll->n->left->typecheck = 1; ll->n->left->typecheck = 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment