]> Cypherpunks repositories - gostls13.git/commitdiff
bug136
authorRuss Cox <rsc@golang.org>
Tue, 20 Oct 2009 03:39:18 +0000 (20:39 -0700)
committerRuss Cox <rsc@golang.org>
Tue, 20 Oct 2009 03:39:18 +0000 (20:39 -0700)
R=ken
OCL=35902
CL=35904

src/cmd/gc/gen.c
src/cmd/gc/go.h
src/cmd/gc/go.y
test/fixedbugs/bug136.go [moved from test/bugs/bug136.go with 100% similarity]
test/golden.out

index e5799a08b4be6276359bfbe71b844652c8b36e15..bb1b19bfc9774727003078676115c1a76bfdfa11 100644 (file)
@@ -62,7 +62,7 @@ allocparams(void)
 }
 
 void
-newlab(int op, Sym *s)
+newlab(int op, Sym *s, Node *stmt)
 {
        Label *lab;
 
@@ -73,6 +73,7 @@ newlab(int op, Sym *s)
        lab->sym = s;
        lab->op = op;
        lab->label = pc;
+       lab->stmt = stmt;
 }
 
 void
@@ -88,7 +89,6 @@ checklabels(void)
 
        for(l=labellist; l!=L; l=l->link) {
        switch(l->op) {
-               case OFOR:
                case OLABEL:
                        // these are definitions -
                        s = l->sym;
@@ -96,7 +96,6 @@ checklabels(void)
                                if(m->sym != s)
                                        continue;
                                switch(m->op) {
-                               case OFOR:
                                case OLABEL:
                                        // these are definitions -
                                        // look for redefinitions
@@ -120,21 +119,6 @@ checklabels(void)
                        yyerror("label %S not defined", l->sym);
 }
 
-Label*
-findlab(Sym *s)
-{
-       Label *l;
-
-       for(l=labellist; l!=L; l=l->link) {
-               if(l->sym != s)
-                       continue;
-               if(l->op != OFOR)
-                       continue;
-               return l;
-       }
-       return L;
-}
-
 /*
  * compile statements
  */
@@ -191,11 +175,11 @@ gen(Node *n)
                break;
 
        case OLABEL:
-               newlab(OLABEL, n->left->sym);
+               newlab(OLABEL, n->left->sym, n->right);
                break;
 
        case OGOTO:
-               newlab(OGOTO, n->left->sym);
+               newlab(OGOTO, n->left->sym, N);
                gjmp(P);
                break;
 
@@ -252,7 +236,7 @@ gen(Node *n)
                continpc = pc;
 
                // define break and continue labels
-               if((lab = labellist) != L && lab->label == p3 && lab->op == OLABEL) {
+               if((lab = labellist) != L && lab->label == p3 && lab->op == OLABEL && lab->stmt == n) {
                        lab->breakpc = breakpc;
                        lab->continpc = continpc;
                }
@@ -291,7 +275,7 @@ gen(Node *n)
                breakpc = gjmp(P);              // break:       goto done
 
                // define break label
-               if((lab = labellist) != L && lab->label == p3 && lab->op == OLABEL)
+               if((lab = labellist) != L && lab->label == p3 && lab->op == OLABEL && lab->stmt == n)
                        lab->breakpc = breakpc;
 
                patch(p1, pc);                          // test:
@@ -306,7 +290,7 @@ gen(Node *n)
                breakpc = gjmp(P);              // break:       goto done
 
                // define break label
-               if((lab = labellist) != L && lab->label == p3 && lab->op == OLABEL)
+               if((lab = labellist) != L && lab->label == p3 && lab->op == OLABEL && lab->stmt == n)
                        lab->breakpc = breakpc;
 
                patch(p1, pc);                          // test:
index 2aa3b3e92791188f136c14fcf41af424393cee8e..35f90a8f703833b551dd1e1c48cbcb53cc7e7f28 100644 (file)
@@ -1089,6 +1089,7 @@ struct    Label
 {
        uchar   op;             // OGOTO/OLABEL
        Sym*    sym;
+       Node*   stmt;
        Prog*   label;          // pointer to code
        Prog*   breakpc;        // pointer to code
        Prog*   continpc;       // pointer to code
@@ -1097,7 +1098,6 @@ struct    Label
 #define        L       ((Label*)0)
 
 EXTERN Label*  labellist;
-EXTERN Label*  findlab(Sym*);
 
 typedef        struct  Plist   Plist;
 struct Plist
@@ -1126,10 +1126,9 @@ void     cgen_callmeth(Node *n, int proc);
 void   cgen_dcl(Node *n);
 void   cgen_proc(Node *n, int proc);
 void   checklabels(void);
-Label* findlab(Sym *s);
 void   gen(Node *n);
 void   genlist(NodeList *l);
-void   newlab(int op, Sym *s);
+void   newlab(int op, Sym *s, Node*);
 Node*  sysfunc(char *name);
 Plist* newplist(void);
 
index 02e941c16f9ba1e74932e2ff2cf5021de74a8164..e9a35171d98482a767ba811ed76dfef02a3386da 100644 (file)
@@ -1380,7 +1380,7 @@ stmt:
        {
                NodeList *l;
 
-               l = list1(nod(OLABEL, $1, N));
+               l = list1(nod(OLABEL, $1, $3));
                if($3)
                        l = list(l, $3);
                $$ = liststmt(l);
similarity index 100%
rename from test/bugs/bug136.go
rename to test/fixedbugs/bug136.go
index 6d70cb9e0d4d4d70618b85aabeed6eeebc329f0c..500440af99d98a90726366b2ec85e9b47fc489f9 100644 (file)
@@ -140,9 +140,6 @@ panic PC=xxx
 
 == bugs/
 
-=========== bugs/bug136.go
-BUG: errchk: command succeeded unexpectedly
-
 =========== bugs/bug162.go
 123
 BUG: should fail