]> Cypherpunks repositories - gostls13.git/commitdiff
random little bugs
authorKen Thompson <ken@golang.org>
Sun, 6 Jul 2008 00:43:25 +0000 (17:43 -0700)
committerKen Thompson <ken@golang.org>
Sun, 6 Jul 2008 00:43:25 +0000 (17:43 -0700)
SVN=126049

src/cmd/gc/const.c
src/cmd/gc/dcl.c
src/cmd/gc/export.c
src/cmd/gc/lex.c
src/cmd/gc/walk.c

index 9bd3e742ef760724dc65e2c141a89eea33e6f7c3..12a7ef83b86e30686f3569989cccc099ade7aa2a 100644 (file)
@@ -140,12 +140,16 @@ evconst(Node *n)
        }
 
        if(wl != wr) {
-               if(wl == Wlitfloat && wr == Wlitint)
-                       convlit(n->right, n->left->type);
-               else
-               if(wl == Wlitint && wr == Wlitfloat)
-                       convlit(n->left, n->right->type);
-               else {
+               if(wl == Wlitfloat && wr == Wlitint) {
+                       nr->val.dval = nr->val.vval;
+                       nr->val.ctype = CTFLT;
+                       wr = whatis(nr);
+               } else
+               if(wl == Wlitint && wr == Wlitfloat) {
+                       nl->val.dval = nl->val.vval;
+                       nl->val.ctype = CTFLT;
+                       wl = whatis(nl);
+               } else {
                        yyerror("illegal combination of literals %d %d", nl->etype, nr->etype);
                        return;
                }
index 0bb35806912aff4beb73b127257c311dce0e0f36..01d27b514e3a0e52171ae3bcbc75616d17c163c7 100644 (file)
@@ -71,7 +71,7 @@ loop:
 
        if(e->op != OLITERAL) {
                yyerror("expression must be a constant");
-               goto loop;
+               return;
        }
        s = n->sym;
 
index 3d81b6bb958ef582bc80e1c2debd3cd539b4cd5b..2ec84908e41ae28efe6ee0bfb1d61436838c86db 100644 (file)
@@ -117,8 +117,10 @@ dumpexportvar(Sym *s)
        s->exported = 1;
 
        n = s->oname;
-       if(n == N || n->type == T)
-               fatal("dumpexportvar: oname nil: %S\n", s);
+       if(n == N || n->type == T) {
+               yyerror("variable exported but not defined: %S\n", s);
+               return;
+       }
 
        t = n->type;
        reexport(t);
@@ -141,8 +143,11 @@ dumpexporttype(Sym *s)
        s->exported = 1;
 
        t = s->otype;
-       if(t == T)
-               fatal("dumpexporttype: otype nil: %S\n", s);
+       if(t == T) {
+               yyerror("type exported but not defined: %S\n", s);
+               return;
+       }
+
        if(t->sym != s)
                fatal("dumpexporttype: cross reference: %S\n", s);
 
index 2642bc88e403eade0cbc89d152a4cc07565db5f0..eec8d0febb000c8f492f3eebd2ac51bcce1ba0a1 100644 (file)
@@ -83,7 +83,8 @@ mainlex(int argc, char *argv[])
        yyparse();
 
        linehist(nil, 0);
-       Bterm(curio.bin);
+       if(curio.bin != nil)
+               Bterm(curio.bin);
 
        if(nerrors)
                errorexit();
index f8c10c3ec9aae7b1f34a01bf7940f16a6c51a061..7d5dcd8bb49badfd84ad484a72d3e670e5fbc4c3 100644 (file)
@@ -427,11 +427,11 @@ loop:
                walktype(n->right, Erv);
                if(n->left == N || n->right == N)
                        goto ret;
-               convlit(n->left, n->right->type);
-               convlit(n->right, n->left->type);
                evconst(n);
                if(n->op == OLITERAL)
                        goto ret;
+               convlit(n->left, n->right->type);
+               convlit(n->right, n->left->type);
                if(n->left->type == T || n->right->type == T)
                        goto ret;
                if(!ascompat(n->left->type, n->right->type))
@@ -503,6 +503,24 @@ loop:
                if(t == T)
                        goto ret;
 
+// BOTCH - convert each index opcode
+// to look like this and get rid of OINDEXPTR
+               if(isptr[t->etype])
+               if(isptrto(t, TSTRING) || isptrto(t->type, TSTRING)) {
+                       // right side must be an int
+                       if(top != Erv)
+                               goto nottop;
+                       if(n->right->type == T) {
+                               convlit(n->right, types[TINT32]);
+                               if(n->right->type == T)
+                                       goto ret;
+                       }
+                       if(!isint[n->right->type->etype])
+                               goto badt;
+                       *n = *stringop(n, top);
+                       goto ret;
+               }
+
                // left side is indirect
                if(isptr[t->etype]) {
                        t = t->type;
@@ -530,20 +548,6 @@ loop:
                                *n = *mapop(n, top);
                        break;
 
-               case TSTRING:
-                       // right side must be an int
-                       if(top != Erv)
-                               goto nottop;
-                       if(n->right->type == T) {
-                               convlit(n->right, types[TINT32]);
-                               if(n->right->type == T)
-                                       break;
-                       }
-                       if(!isint[n->right->type->etype])
-                               goto badt;
-                       *n = *stringop(n, top);
-                       break;
-
                case TARRAY:
                case TDARRAY:
                        // right side must be an int
@@ -989,7 +993,7 @@ ascompatee(int op, Node **nl, Node **nr)
 loop:
        if(l == N || r == N) {
                if(l != r)
-                       yyerror("error in shape across assignment");
+                       yyerror("error in shape across %O", op);
                return rev(nn);
        }
 
@@ -1030,7 +1034,7 @@ ascompatet(int op, Node **nl, Type **nr, int fp)
 loop:
        if(l == N || r == T) {
                if(l != N || r != T)
-                       yyerror("error in shape across assignment");
+                       yyerror("error in shape across %O", op);
                return rev(nn);
        }
 
@@ -1072,7 +1076,7 @@ ascompatte(int op, Type **nl, Node **nr, int fp)
 loop:
        if(l == T || r == N) {
                if(l != T || r != N)
-                       yyerror("error in shape across assignment");
+                       yyerror("error in shape across %O", op);
                return rev(nn);
        }
        convlit(r, l->type);
@@ -1293,11 +1297,17 @@ stringop(Node *n, int top)
                r = nod(OCALL, on, r);
                break;
 
-       case OINDEXPTR:
+       case OINDEX:
                // sys_indexstring(s, i)
+               c = n->left;
+               if(isptrto(c->type->type, TSTRING)) {
+                       // lhs is string or *string
+                       c = nod(OIND, c, N);
+                       c->type = c->left->type->type;
+               }
                r = nod(OCONV, n->right, N);
                r->type = types[TINT32];
-               r = nod(OLIST, n->left, r);
+               r = nod(OLIST, c, r);
                on = syslook("indexstring", 0);
                r = nod(OCALL, on, r);
                break;