]> Cypherpunks repositories - gostls13.git/commitdiff
gc: distinguish fatal compiler bug from error+exit
authorRuss Cox <rsc@golang.org>
Sun, 11 Apr 2010 21:52:06 +0000 (14:52 -0700)
committerRuss Cox <rsc@golang.org>
Sun, 11 Apr 2010 21:52:06 +0000 (14:52 -0700)
R=ken2
CC=golang-dev
https://golang.org/cl/902044

src/cmd/gc/lex.c
src/cmd/gc/obj.c
src/cmd/gc/subr.c
src/cmd/gc/typecheck.c

index 4202ba7cd2c42431a4a75ca4ae8d61cc1fc7f08a..57d6e184d7f4b5d7b04850e5524ade672b2c9f6c 100644 (file)
@@ -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)
index 12054645f1c2eada99136c0cfda894b6631cba50..97786cd6e436f6562fe37976aa9be9288739a8ce 100644 (file)
@@ -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");
index 54968dc15fabbf6e9eda00d693d1a74c462f3799..34b54984201561f2b0a47f011cd7894b59f3b6a6 100644 (file)
@@ -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)
index 65c2384778f2e2c19e10b89d73d7b40ed377c55e..8c8646e411c9d8bdefdc0eab3db3c1e6625e8113 100644 (file)
@@ -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;