diff --git a/src/cmd/gc/gen.c b/src/cmd/gc/gen.c index e5799a08b4b..bb1b19bfc97 100644 --- a/src/cmd/gc/gen.c +++ b/src/cmd/gc/gen.c @@ -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: diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h index 2aa3b3e9279..35f90a8f703 100644 --- a/src/cmd/gc/go.h +++ b/src/cmd/gc/go.h @@ -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); diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y index 02e941c16f9..e9a35171d98 100644 --- a/src/cmd/gc/go.y +++ b/src/cmd/gc/go.y @@ -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); diff --git a/test/bugs/bug136.go b/test/fixedbugs/bug136.go similarity index 100% rename from test/bugs/bug136.go rename to test/fixedbugs/bug136.go diff --git a/test/golden.out b/test/golden.out index 6d70cb9e0d4..500440af99d 100644 --- a/test/golden.out +++ b/test/golden.out @@ -140,9 +140,6 @@ panic PC=xxx == bugs/ -=========== bugs/bug136.go -BUG: errchk: command succeeded unexpectedly - =========== bugs/bug162.go 123 BUG: should fail