mirror of
https://github.com/golang/go
synced 2024-11-25 00:07:56 -07:00
bug136
R=ken OCL=35902 CL=35904
This commit is contained in:
parent
a15aa05ae2
commit
62c4818ee0
@ -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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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
|
|||||||
{
|
{
|
||||||
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
|
|||||||
#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);
|
|||||||
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:
|
|||||||
{
|
{
|
||||||
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
|
|||||||
|
|
||||||
== bugs/
|
== bugs/
|
||||||
|
|
||||||
=========== bugs/bug136.go
|
|
||||||
BUG: errchk: command succeeded unexpectedly
|
|
||||||
|
|
||||||
=========== bugs/bug162.go
|
=========== bugs/bug162.go
|
||||||
123
|
123
|
||||||
BUG: should fail
|
BUG: should fail
|
||||||
|
Loading…
Reference in New Issue
Block a user