bug136

R=ken
OCL=35902
CL=35904
diff --git a/src/cmd/gc/gen.c b/src/cmd/gc/gen.c
index e5799a0..bb1b19b 100644
--- a/src/cmd/gc/gen.c
+++ b/src/cmd/gc/gen.c
@@ -62,7 +62,7 @@
 }
 
 void
-newlab(int op, Sym *s)
+newlab(int op, Sym *s, Node *stmt)
 {
 	Label *lab;
 
@@ -73,6 +73,7 @@
 	lab->sym = s;
 	lab->op = op;
 	lab->label = pc;
+	lab->stmt = stmt;
 }
 
 void
@@ -88,7 +89,6 @@
 
 	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 @@
 				if(m->sym != s)
 					continue;
 				switch(m->op) {
-				case OFOR:
 				case OLABEL:
 					// these are definitions -
 					// look for redefinitions
@@ -120,21 +119,6 @@
 			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 @@
 		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 @@
 		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 @@
 		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 @@
 		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 2aa3b3e..35f90a8 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -1089,6 +1089,7 @@
 {
 	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 @@
 #define	L	((Label*)0)
 
 EXTERN	Label*	labellist;
-EXTERN	Label*	findlab(Sym*);
 
 typedef	struct	Plist	Plist;
 struct	Plist
@@ -1126,10 +1126,9 @@
 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 02e941c..e9a3517 100644
--- a/src/cmd/gc/go.y
+++ b/src/cmd/gc/go.y
@@ -1380,7 +1380,7 @@
 	{
 		NodeList *l;
 
-		l = list1(nod(OLABEL, $1, N));
+		l = list1(nod(OLABEL, $1, $3));
 		if($3)
 			l = list(l, $3);
 		$$ = liststmt(l);