diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index 45dc62dbbd0410b208784ed366aae65088dc2953..8a494f72e9bf5011f89642e47f1896792707a731 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -974,13 +974,40 @@ selcase(Node *n, Node *var) goto out; recv: - walktype(c->left, Elv); // elem + if(c->right != N) + goto recv2; + + walktype(c->left, Erv); // chan + + t = fixchan(c->left->type); + if(t == T) + return; + + // selectrecv(sel *byte, hchan *chan any, elem *any) (selected bool); + on = syslook("selectrecv", 1); + argtype(on, t->type); + argtype(on, t->type); + + a = c->left; // nil elem + a = nod(OLITERAL, N, N); + a->val.ctype = CTNIL; + a->val.vval = 0; + + r = a; + a = c->left; // chan + r = list(a, r); + a = var; // sel-var + r = list(a, r); + goto out; + +recv2: walktype(c->right, Erv); // chan t = fixchan(c->right->type); if(t == T) return; + walktype(c->left, Elv); // elem convlit(c->left, t->type); if(!ascompat(t->type, c->left->type)) { badtype(c->op, t->type, c->left->type); @@ -1958,7 +1985,6 @@ chanop(Node *n, int top) r = a; a = n->left; // elem if(a == N) { - a = nil; a = nod(OLITERAL, N, N); a->val.ctype = CTNIL; a->val.vval = 0;