]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: fix strict tree property for AST for OAS2RECV nodes.
authorLuuk van Dijk <lvd@golang.org>
Mon, 22 Oct 2012 08:01:14 +0000 (10:01 +0200)
committerLuuk van Dijk <lvd@golang.org>
Mon, 22 Oct 2012 08:01:14 +0000 (10:01 +0200)
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

src/cmd/gc/select.c
src/cmd/gc/typecheck.c

index 8ace1d4ee547f9dfd05cd082a577718d828ccf0e..6d8793b89b87f6de798103fb3db57daca055bfa3 100644 (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;
index e5bcabca0d3c4b9795edcf070c90af41cf762ba3..2ee468a58ac144e32eede255fe142dfa5b61aad7 100644 (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;