Commit 62c4818e authored by Russ Cox's avatar Russ Cox

bug136

R=ken
OCL=35902
CL=35904
parent a15aa05a
...@@ -62,7 +62,7 @@ allocparams(void) ...@@ -62,7 +62,7 @@ allocparams(void)
} }
void void
newlab(int op, Sym *s) newlab(int op, Sym *s, Node *stmt)
{ {
Label *lab; Label *lab;
...@@ -73,6 +73,7 @@ newlab(int op, Sym *s) ...@@ -73,6 +73,7 @@ newlab(int op, Sym *s)
lab->sym = s; lab->sym = s;
lab->op = op; lab->op = op;
lab->label = pc; lab->label = pc;
lab->stmt = stmt;
} }
void void
...@@ -88,7 +89,6 @@ checklabels(void) ...@@ -88,7 +89,6 @@ checklabels(void)
for(l=labellist; l!=L; l=l->link) { for(l=labellist; l!=L; l=l->link) {
switch(l->op) { switch(l->op) {
case OFOR:
case OLABEL: case OLABEL:
// these are definitions - // these are definitions -
s = l->sym; s = l->sym;
...@@ -96,7 +96,6 @@ checklabels(void) ...@@ -96,7 +96,6 @@ checklabels(void)
if(m->sym != s) if(m->sym != s)
continue; continue;
switch(m->op) { switch(m->op) {
case OFOR:
case OLABEL: case OLABEL:
// these are definitions - // these are definitions -
// look for redefinitions // look for redefinitions
...@@ -120,21 +119,6 @@ checklabels(void) ...@@ -120,21 +119,6 @@ checklabels(void)
yyerror("label %S not defined", l->sym); 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 * compile statements
*/ */
...@@ -191,11 +175,11 @@ gen(Node *n) ...@@ -191,11 +175,11 @@ gen(Node *n)
break; break;
case OLABEL: case OLABEL:
newlab(OLABEL, n->left->sym); newlab(OLABEL, n->left->sym, n->right);
break; break;
case OGOTO: case OGOTO:
newlab(OGOTO, n->left->sym); newlab(OGOTO, n->left->sym, N);
gjmp(P); gjmp(P);
break; break;
...@@ -252,7 +236,7 @@ gen(Node *n) ...@@ -252,7 +236,7 @@ gen(Node *n)
continpc = pc; continpc = pc;
// define break and continue labels // 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->breakpc = breakpc;
lab->continpc = continpc; lab->continpc = continpc;
} }
...@@ -291,7 +275,7 @@ gen(Node *n) ...@@ -291,7 +275,7 @@ gen(Node *n)
breakpc = gjmp(P); // break: goto done breakpc = gjmp(P); // break: goto done
// define break label // 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; lab->breakpc = breakpc;
patch(p1, pc); // test: patch(p1, pc); // test:
...@@ -306,7 +290,7 @@ gen(Node *n) ...@@ -306,7 +290,7 @@ gen(Node *n)
breakpc = gjmp(P); // break: goto done breakpc = gjmp(P); // break: goto done
// define break label // 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; lab->breakpc = breakpc;
patch(p1, pc); // test: patch(p1, pc); // test:
......
...@@ -1089,6 +1089,7 @@ struct Label ...@@ -1089,6 +1089,7 @@ struct Label
{ {
uchar op; // OGOTO/OLABEL uchar op; // OGOTO/OLABEL
Sym* sym; Sym* sym;
Node* stmt;
Prog* label; // pointer to code Prog* label; // pointer to code
Prog* breakpc; // pointer to code Prog* breakpc; // pointer to code
Prog* continpc; // pointer to code Prog* continpc; // pointer to code
...@@ -1097,7 +1098,6 @@ struct Label ...@@ -1097,7 +1098,6 @@ struct Label
#define L ((Label*)0) #define L ((Label*)0)
EXTERN Label* labellist; EXTERN Label* labellist;
EXTERN Label* findlab(Sym*);
typedef struct Plist Plist; typedef struct Plist Plist;
struct Plist struct Plist
...@@ -1126,10 +1126,9 @@ void cgen_callmeth(Node *n, int proc); ...@@ -1126,10 +1126,9 @@ void cgen_callmeth(Node *n, int proc);
void cgen_dcl(Node *n); void cgen_dcl(Node *n);
void cgen_proc(Node *n, int proc); void cgen_proc(Node *n, int proc);
void checklabels(void); void checklabels(void);
Label* findlab(Sym *s);
void gen(Node *n); void gen(Node *n);
void genlist(NodeList *l); void genlist(NodeList *l);
void newlab(int op, Sym *s); void newlab(int op, Sym *s, Node*);
Node* sysfunc(char *name); Node* sysfunc(char *name);
Plist* newplist(void); Plist* newplist(void);
......
...@@ -1380,7 +1380,7 @@ stmt: ...@@ -1380,7 +1380,7 @@ stmt:
{ {
NodeList *l; NodeList *l;
l = list1(nod(OLABEL, $1, N)); l = list1(nod(OLABEL, $1, $3));
if($3) if($3)
l = list(l, $3); l = list(l, $3);
$$ = liststmt(l); $$ = liststmt(l);
......
...@@ -140,9 +140,6 @@ panic PC=xxx ...@@ -140,9 +140,6 @@ panic PC=xxx
== bugs/ == bugs/
=========== bugs/bug136.go
BUG: errchk: command succeeded unexpectedly
=========== bugs/bug162.go =========== bugs/bug162.go
123 123
BUG: should fail BUG: should fail
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment