From 9475cafa7340df9b86c359fa16ce03c005283229 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Sun, 11 Apr 2010 14:52:06 -0700 Subject: [PATCH] gc: distinguish fatal compiler bug from error+exit R=ken2 CC=golang-dev https://golang.org/cl/902044 --- src/cmd/gc/lex.c | 31 ++++++++++++++++++++----------- src/cmd/gc/obj.c | 7 +++++-- src/cmd/gc/subr.c | 30 ++++++++++++++++++++++-------- src/cmd/gc/typecheck.c | 4 ++-- 4 files changed, 49 insertions(+), 23 deletions(-) diff --git a/src/cmd/gc/lex.c b/src/cmd/gc/lex.c index 4202ba7cd2..57d6e184d7 100644 --- a/src/cmd/gc/lex.c +++ b/src/cmd/gc/lex.c @@ -110,8 +110,10 @@ main(int argc, char *argv[]) curio.infile = infile; curio.bin = Bopen(infile, OREAD); - if(curio.bin == nil) - fatal("open %s: %r", infile); + if(curio.bin == nil) { + print("open %s: %r\n", infile); + errorexit(); + } curio.peekc = 0; curio.peekc1 = 0; curio.nlsemi = 0; @@ -300,8 +302,10 @@ importfile(Val *f, int line) return; } - if(strlen(f->u.sval->s) != f->u.sval->len) - fatal("import path contains NUL"); + if(strlen(f->u.sval->s) != f->u.sval->len) { + yyerror("import path contains NUL"); + errorexit(); + } if(strcmp(f->u.sval->s, "unsafe") == 0) { importpkg = mkpkg(f->u.sval); @@ -317,20 +321,25 @@ importfile(Val *f, int line) path = strlit(cleanbuf); } - if(!findpkg(path)) - fatal("can't find import: %Z", f->u.sval); - + if(!findpkg(path)) { + yyerror("can't find import: %Z", f->u.sval); + errorexit(); + } importpkg = mkpkg(path); imp = Bopen(namebuf, OREAD); - if(imp == nil) - fatal("can't open import: %Z", f->u.sval); + if(imp == nil) { + yyerror("can't open import: %Z", f->u.sval); + errorexit(); + } file = strdup(namebuf); len = strlen(namebuf); if(len > 2 && namebuf[len-2] == '.' && namebuf[len-1] == 'a') { - if(!skiptopkgdef(imp)) - fatal("import not package file: %s", namebuf); + if(!skiptopkgdef(imp)) { + yyerror("import not package file: %s", namebuf); + errorexit(); + } } // assume files move (get installed) diff --git a/src/cmd/gc/obj.c b/src/cmd/gc/obj.c index 12054645f1..97786cd6e4 100644 --- a/src/cmd/gc/obj.c +++ b/src/cmd/gc/obj.c @@ -12,8 +12,11 @@ void dumpobj(void) { bout = Bopen(outfile, OWRITE); - if(bout == nil) - fatal("cant open %s", outfile); + if(bout == nil) { + flusherrors(); + print("can't create %s: %r\n", outfile); + errorexit(); + } Bprint(bout, "%s\n", thestring); Bprint(bout, " exports automatically generated from\n"); diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c index 54968dc15f..34b5498420 100644 --- a/src/cmd/gc/subr.c +++ b/src/cmd/gc/subr.c @@ -118,8 +118,11 @@ yyerrorl(int line, char *fmt, ...) hcrash(); nerrors++; - if(nerrors >= 10 && !debug['e']) - fatal("too many errors"); + if(nerrors >= 10 && !debug['e']) { + flusherrors(); + print("%L: too many errors\n", line); + errorexit(); + } } extern int yystate, yychar; @@ -172,8 +175,11 @@ yyerror(char *fmt, ...) hcrash(); nerrors++; - if(nerrors >= 10 && !debug['e']) - fatal("too many errors"); + if(nerrors >= 10 && !debug['e']) { + flusherrors(); + print("%L: too many errors\n", parserline()); + errorexit(); + } } void @@ -195,12 +201,18 @@ fatal(char *fmt, ...) flusherrors(); - print("%L: fatal error: ", lineno); + print("%L: internal compiler error: ", lineno); va_start(arg, fmt); vfprint(1, fmt, arg); va_end(arg); 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(); errorexit(); } @@ -3549,8 +3561,10 @@ mkpkg(Strlit *path) Pkg *p; int h; - if(strlen(path->s) != path->len) - fatal("import path contains NUL byte"); + if(strlen(path->s) != path->len) { + yyerror("import path contains NUL byte"); + errorexit(); + } h = stringhash(path->s) & (nelem(phash)-1); for(p=phash[h]; p; p=p->link) diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c index 65c2384778..8c8646e411 100644 --- a/src/cmd/gc/typecheck.c +++ b/src/cmd/gc/typecheck.c @@ -1709,7 +1709,7 @@ exportassignok(Type *t, char *desc) prefix = " in "; else 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; } if(!exportassignok(f->type, desc)) @@ -1935,7 +1935,7 @@ typecheckcomplit(Node **np) } s = f->sym; 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 = nod(OKEY, newname(f->sym), ll->n); ll->n->left->typecheck = 1; -- 2.48.1