From e7f89fcb1cdd5fc41377108fcaad2363d4456b24 Mon Sep 17 00:00:00 2001 From: Luuk van Dijk Date: Mon, 22 Oct 2012 10:01:14 +0200 Subject: [PATCH] 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 --- src/cmd/gc/select.c | 5 +++-- src/cmd/gc/typecheck.c | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cmd/gc/select.c b/src/cmd/gc/select.c index 8ace1d4ee5..6d8793b89b 100644 --- a/src/cmd/gc/select.c +++ b/src/cmd/gc/select.c @@ -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; diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c index e5bcabca0d..2ee468a58a 100644 --- a/src/cmd/gc/typecheck.c +++ b/src/cmd/gc/typecheck.c @@ -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; -- 2.48.1