1
0
mirror of https://github.com/golang/go synced 2024-11-26 15:46:54 -07:00

cmd/gc: fix strict tree property for AST for OAS2RECV nodes.

in typecheck and walk, conversion from OAS2RECV to OAS2
and to OSELRECV2 duplicated the ->rlist->n to ->right
thereby destroying the strict tree-ness of the AST (up to
ONAMES) of course.  Several recursions in esc.c and inl.c
and probably elsewhere assume nodes of the tree aren't duplicated.
rather than defensively code around this, i'd rather assert
these cases away and fix their cause.

(this was tripped in 6741044)

R=rsc
CC=golang-dev
https://golang.org/cl/6750043
This commit is contained in:
Luuk van Dijk 2012-10-22 10:01:14 +02:00
parent 9714691a3f
commit e7f89fcb1c
2 changed files with 3 additions and 3 deletions

View File

@ -62,7 +62,7 @@ typecheckselect(Node *sel)
case OAS2RECV:
// convert x, ok = <-c into OSELRECV2(x, <-c) with ntest=ok
if(n->right->op != ORECV) {
if(n->rlist->n->op != ORECV) {
yyerror("select assignment must have receive on right hand side");
break;
}
@ -70,6 +70,7 @@ typecheckselect(Node *sel)
n->left = n->list->n;
n->ntest = n->list->next->n;
n->right = n->rlist->n;
n->rlist = nil;
break;
case ORECV:
@ -146,7 +147,7 @@ walkselect(Node *sel)
a = nod(OAS2, N, N);
a->list = n->list;
a->rlist = n->rlist;
a->rlist = list1(n->right);
n = a;
typecheck(&n, Etop);
break;

View File

@ -2574,7 +2574,6 @@ typecheckas2(Node *n)
goto common;
case ORECV:
n->op = OAS2RECV;
n->right = n->rlist->n;
goto common;
case ODOTTYPE:
n->op = OAS2DOTTYPE;