]> Cypherpunks repositories - gostls13.git/commitdiff
rewriting bugs
authorKen Thompson <ken@golang.org>
Thu, 4 Sep 2008 19:21:10 +0000 (12:21 -0700)
committerKen Thompson <ken@golang.org>
Thu, 4 Sep 2008 19:21:10 +0000 (12:21 -0700)
R=r
OCL=14810
CL=14810

src/cmd/gc/const.c
src/cmd/gc/go.h
src/cmd/gc/go.y
src/cmd/gc/subr.c
src/cmd/gc/walk.c

index f8c6acbc0e3752a963ade30a8f9837e24dbbba64..3d967f57855b7db44de1a5a4e340bbf37bb185e5 100644 (file)
@@ -24,7 +24,18 @@ convlit(Node *n, Type *t)
                n->type = n->left->type;
                return;
        }
+
        et = t->etype;
+       switch(et) {
+       case TARRAY:
+       case TFUNC:
+       case TCHAN:
+       case TMAP:
+//     case TPTR32:
+//     case TPTR64:
+               return;
+       }
+
        switch(whatis(n)) {
        default:
                goto bad1;
index 9a6b0422405382501ffd5b554319c2901407c551..11d8b56b9c58565ff04c80738f404ea520ea63e9 100644 (file)
@@ -258,7 +258,7 @@ enum
        OLIST, OCMP,
        OPTR, OARRAY,
        ORETURN, OFOR, OIF, OSWITCH, OI2S, OS2I, OI2I,
-       OAS, OASOP, OCASE, OXCASE, OSCASE, OFALL, OXFALL,
+       OAS, OASOP, OCASE, OXCASE, OFALL, OXFALL,
        OGOTO, OPROC, ONEW, OEMPTY, OSELECT,
        OLEN, OCAP, OPANIC, OPRINT, OTYPEOF,
 
@@ -661,7 +661,9 @@ void        doimport8(Node*, Val*, Node*);
  *     walk.c
  */
 void   walk(Node*);
+void   walkstate(Node*);
 void   walktype(Node*, int);
+void   walkas(Node*);
 void   walkbool(Node*);
 Type*  walkswitch(Node*, Type*(*)(Node*, Type*));
 int    casebody(Node*);
index a02425c3c208bd160e1854d476ea56283bb4502c..e2dcb088c6142345113856bdf88e09ce44cd0961 100644 (file)
@@ -42,7 +42,7 @@
 %type  <node>          range_header range_body range_stmt select_stmt
 %type  <node>          simple_stmt osimple_stmt semi_stmt
 %type  <node>          expr uexpr pexpr expr_list oexpr oexpr_list expr_list_r
-%type  <node>          name name_name onew_name new_name new_name_list_r conexpr
+%type  <node>          name name_name onew_name new_name new_name_list_r
 %type  <node>          vardcl_list_r vardcl Avardcl Bvardcl
 %type  <node>          interfacedcl_list_r interfacedcl
 %type  <node>          structdcl_list_r structdcl
@@ -182,7 +182,13 @@ Acommon_dcl:
        {
                $$ = rev($3);
        }
-|      LCONST '(' constdcl_list_r osemi ')'
+|      LCONST '(' constdcl osemi ')'
+       {
+               iota = 0;
+               lastconst = N;
+               $$ = N;
+       }
+|      LCONST '(' constdcl ';' constdcl_list_r osemi ')'
        {
                iota = 0;
                lastconst = N;
@@ -234,7 +240,7 @@ Bvardcl:
 
                $$ = nod(OAS, $$, N);
        }
-|      new_name_list_r type '=' oexpr_list
+|      new_name_list_r type '=' expr_list
        {
                $$ = rev($1);
                dodclvar($$, $2);
@@ -250,29 +256,43 @@ Bvardcl:
        }
 
 constdcl:
-       new_name conexpr
+       new_name type '=' expr
        {
-               walktype($2, Erv);
-               dodclconst($1, $2);
+               Node *c = treecopy($4);
+               walktype(c, Erv);
+               convlit(c, $2);
+               dodclconst($1, c);
+
+               lastconst = $4;
+               iota += 1;
        }
-|      new_name type conexpr
+|      new_name '=' expr
        {
-               walktype($3, Erv);
-               convlit($3, $2);
-               dodclconst($1, $3);
+               Node *c = treecopy($3);
+               walktype(c, Erv);
+               dodclconst($1, c);
+
+               lastconst = $3;
+               iota += 1;
        }
 
-conexpr:
+constdcl1:
+       constdcl
+|      new_name type
        {
-               if(lastconst == N)
-                       yyerror("first constant must evaluate an expression");
-               $$ = treecopy(lastconst);
+               Node *c = treecopy(lastconst);
+               walktype(c, Erv);
+               convlit(c, $2);
+               dodclconst($1, c);
+
                iota += 1;
        }
-|      '=' expr
+|      new_name
        {
-               lastconst = $2;
-               $$ = treecopy(lastconst);
+               Node *c = treecopy(lastconst);
+               walktype(c, Erv);
+               dodclconst($1, c);
+
                iota += 1;
        }
 
@@ -1041,14 +1061,6 @@ Afntypeh:
                $$ = functype(N, $3, $5);
                funcnam($$, nil);
        }
-|      LFUNC '(' oarg_type_list ')' '.' '(' oarg_type_list ')' Afnres
-       /* i dont believe that this form is useful for anything */
-       {
-               if($3 == N || $3->op == OLIST)
-                       yyerror("syntax error in method receiver");
-               $$ = functype($3, $7, $9);
-               funcnam($$, nil);
-       }
 
 Bfntypeh:
        LFUNC '(' oarg_type_list ')' Bfnres
@@ -1056,14 +1068,6 @@ Bfntypeh:
                $$ = functype(N, $3, $5);
                funcnam($$, nil);
        }
-|      LFUNC '(' oarg_type_list ')' '.' '(' oarg_type_list ')' Bfnres
-       /* i dont believe that this form is useful for anything */
-       {
-               if($3 == N || $3->op == OLIST)
-                       yyerror("syntax error in method receiver");
-               $$ = functype($3, $7, $9);
-               funcnam($$, nil);
-       }
 
 fntype:
        fntypeh
@@ -1168,8 +1172,8 @@ vardcl_list_r:
        }
 
 constdcl_list_r:
-       constdcl
-|      constdcl_list_r ';' constdcl
+       constdcl1
+|      constdcl_list_r ';' constdcl1
 
 typedcl_list_r:
        typedcl
@@ -1415,7 +1419,7 @@ keyexpr_list:
        {
                $$ = rev($1);
        }
-|      expr_list
+|      oexpr_list
 
 /*
  * the one compromise of a
index 33628d07a1b74f48580f04da286d370cad9fb3dc..c1bb941fc817d107fae7ed341c793d65141c3ff5 100644 (file)
@@ -591,7 +591,6 @@ opnames[] =
        [OCALLINTER]    = "CALLINTER",
        [OCASE]         = "CASE",
        [OXCASE]        = "XCASE",
-       [OSCASE]        = "SCASE",
        [OCMP]          = "CMP",
        [OFALL]         = "FALL",
        [OCONV]         = "CONV",
index f1889864c1f2d106408fa8b3ff40cabefb20df00..661e64efd26986c45f252bbef8495ca5a50bd7ec 100644 (file)
@@ -16,13 +16,74 @@ walk(Node *fn)
        if(debug['W'])
                dump("fn-before", fn->nbody);
        curfn = fn;
-       walktype(fn->nbody, Etop);
+       walkstate(fn->nbody);
        if(debug['W'])
                dump("fn", fn->nbody);
 }
 
 void
-walktype1(Node *n, int top)
+walkstate(Node *n)
+{
+       Node *l, *more;
+
+loop:
+       if(n == N)
+               return;
+
+       more = N;
+       switch(n->op) {
+
+       case OLIST:
+               walkstate(n->left);
+               more = n->right;
+               break;
+
+       default:
+               yyerror("walkstate: %O not a top level statement", n->op);
+
+       case OASOP:
+       case OAS:
+       case OCALLMETH:
+       case OCALLINTER:
+       case OCALL:
+       case OSEND:
+       case ORECV:
+       case OPRINT:
+       case OPANIC:
+       case OFOR:
+       case OIF:
+       case OSWITCH:
+       case OSELECT:
+       case OEMPTY:
+       case OBREAK:
+       case OCONTINUE:
+       case OGOTO:
+       case OLABEL:
+       case OFALL:
+       case OXCASE:
+       case OCASE:
+       case OXFALL:
+       case ORETURN:
+       case OPROC:
+               walktype(n, Etop);
+               break;
+       }
+
+       while(addtop != N) {
+               l = addtop;
+               addtop = N;
+               walktype(l, Etop);
+               n->ninit = list(n->ninit, l);
+       }
+
+       if(more != N) {
+               n = more;
+               goto loop;
+       }
+}
+
+void
+walktype(Node *n, int top)
 {
        Node *r, *l;
        Type *t;
@@ -108,11 +169,11 @@ loop:
        case OFOR:
                if(top != Etop)
                        goto nottop;
-               walktype(n->ninit, Etop);
+               walkstate(n->ninit);
                walkbool(n->ntest);
-               walktype(n->nincr, Etop);
-               n = n->nbody;
-               goto loop;
+               walkstate(n->nincr);
+               walkstate(n->nbody);
+               goto ret;
 
        case OSWITCH:
                if(top != Etop)
@@ -123,9 +184,9 @@ loop:
 
                if(n->ntest == N)
                        n->ntest = booltrue;
-               walktype(n->ninit, Etop);
+               walkstate(n->ninit);
                walktype(n->ntest, Erv);
-               walktype(n->nbody, Etop);
+               walkstate(n->nbody);
 
                // find common type
                if(n->ntest->type == T)
@@ -149,13 +210,6 @@ loop:
                walkselect(n);
                goto ret;
 
-       case OSCASE:
-               if(top != Etop)
-                       goto nottop;
-//             walktype(n->left, Erv); SPECIAL
-               n = n->right;
-               goto loop;
-
        case OEMPTY:
                if(top != Etop)
                        goto nottop;
@@ -164,16 +218,16 @@ loop:
        case OIF:
                if(top != Etop)
                        goto nottop;
-               walktype(n->ninit, Etop);
+               walkstate(n->ninit);
                walkbool(n->ntest);
-               walktype(n->nelse, Etop);
-               n = n->nbody;
-               goto loop;
+               walkstate(n->nelse);
+               walkstate(n->nbody);
+               goto ret;
 
        case OPROC:
                if(top != Etop)
                        goto nottop;
-               walktype(n->left, Etop);
+               walkstate(n->left);
                goto ret;
 
        case OCALLMETH:
@@ -345,8 +399,8 @@ loop:
                if(top != Etop)
                        goto nottop;
                walktype(n->left, Erv);
-               n = n->right;
-               goto loop;
+               walkstate(n->right);
+               goto ret;
 
        case OXFALL:
                if(top != Etop)
@@ -480,7 +534,7 @@ loop:
                if(!isptrto(l->left->type, TMAP))
                        goto com;
                *n = *mapop(n, top);
-               goto loop;
+               goto ret;
 
        case OLSH:
        case ORSH:
@@ -1179,8 +1233,8 @@ walkselect(Node *sel)
        sel->nbody = rev(res);
        sel->left = N;
 
-       walktype(sel->ninit, Etop);
-       walktype(sel->nbody, Etop);
+       walkstate(sel->ninit);
+       walkstate(sel->nbody);
 
 //dump("sel", sel);
 
@@ -1476,7 +1530,7 @@ prcompat(Node *n)
 
 loop:
        if(l == N) {
-               walktype(r, Etop);
+               walktype(r, Erv);
                return r;
        }
 
@@ -1538,7 +1592,7 @@ nodpanic(int32 lineno)
        on = syslook("panicl", 0);
        n = nodintconst(lineno);
        n = nod(OCALL, on, n);
-       walktype(n, Etop);
+       walktype(n, Erv);
        return n;
 }
 
@@ -2124,7 +2178,7 @@ chanop(Node *n, int top)
                argtype(on, t->type);   // any-1
                argtype(on, t->type);   // any-2
                r = nod(OCALL, on, r);
-               walktype(r, top);
+               walktype(r, Etop);
                break;
 
        send2:
@@ -2142,7 +2196,7 @@ chanop(Node *n, int top)
                argtype(on, t->type);   // any-1
                argtype(on, t->type);   // any-2
                r = nod(OCALL, on, r);
-               walktype(r, top);
+               walktype(r, Etop);
                break;
        }
        return r;
@@ -2318,20 +2372,6 @@ arrayop(Node *n, int top)
        return r;
 }
 
-void
-walktype(Node *n, int top)
-{
-       Node *r;
-
-       walktype1(n, top);
-       while(top == Etop && addtop != N) {
-               r = addtop;
-               addtop = N;
-               walktype1(r, top);
-               n->ninit = list(n->ninit, r);
-       }
-}
-
 void
 diagnamed(Type *t)
 {