"func \"\".mapiter2 (hiter *any) (key any, val any)\n"
"func \"\".makechan (elem *uint8, hint int64) chan any\n"
"func \"\".chanrecv1 (hchan <-chan any) any\n"
- "func \"\".chanrecv2 (hchan <-chan any) (elem any, pres bool)\n"
"func \"\".chanrecv3 (hchan <-chan any) (elem any, closed bool)\n"
"func \"\".chansend1 (hchan chan<- any, elem any)\n"
- "func \"\".chansend2 (hchan chan<- any, elem any) bool\n"
"func \"\".closechan (hchan any)\n"
"func \"\".closedchan (hchan any) bool\n"
"func \"\".selectnbsend (hchan chan<- any, elem any) bool\n"
OARRAY,
OARRAYBYTESTR, OARRAYRUNESTR,
OSTRARRAYBYTE, OSTRARRAYRUNE,
- OAS, OAS2, OAS2MAPW, OAS2FUNC, OAS2RECV, OAS2RECVCLOSED, OAS2MAPR, OAS2DOTTYPE, OASOP,
+ OAS, OAS2, OAS2MAPW, OAS2FUNC, OAS2RECVCLOSED, OAS2MAPR, OAS2DOTTYPE, OASOP,
OBAD,
OCALL, OCALLFUNC, OCALLMETH, OCALLINTER,
OCAP,
ONOT, OCOM, OPLUS, OMINUS,
OOROR,
OPANIC, OPRINT, OPRINTN,
- OSEND, OSENDNB,
+ OSEND,
OSLICE, OSLICEARR, OSLICESTR,
ORECOVER,
ORECV,
{
$$ = nod(ORSH, $1, $3);
}
+ /* not an expression anymore, but left in so we can give a good error */
| expr LCOMM expr
{
$$ = nod(OSEND, $1, $3);
// *byte is really *runtime.Type
func makechan(elem *byte, hint int64) (hchan chan any)
func chanrecv1(hchan <-chan any) (elem any)
-func chanrecv2(hchan <-chan any) (elem any, pres bool)
func chanrecv3(hchan <-chan any) (elem any, closed bool)
func chansend1(hchan chan<- any, elem any)
-func chansend2(hchan chan<- any, elem any) (pres bool)
func closechan(hchan any)
func closedchan(hchan any) bool
case OAS2FUNC:
case OAS2MAPR:
case OAS2DOTTYPE:
- case OAS2RECV:
case OAS2RECVCLOSED:
if(n->defn->initorder)
break;
goto ret;
case OSEND:
- if(0 && top == Erv) {
- // can happen because grammar for if header accepts
- // simple_stmt for condition. Falling through would give
- // an error "c <- v used as value" but we can do better.
+ if(top & Erv) {
yyerror("send statement %#N used as value; use select for non-blocking send", n);
goto error;
}
// TODO: more aggressive
n->etype = 0;
n->type = T;
- if(top & Erv) {
- n->op = OSENDNB;
- n->type = types[TBOOL];
- }
goto ret;
case OSLICE:
n->op = OAS2MAPR;
goto common;
case ORECV:
- n->op = OAS2RECV;
- goto common;
yyerror("cannot use multiple-value assignment for non-blocking receive; use select");
goto out;
case ODOTTYPE:
case OAS:
case OAS2:
case OAS2DOTTYPE:
- case OAS2RECV:
case OAS2RECVCLOSED:
case OAS2FUNC:
case OAS2MAPW:
n = liststmt(concat(concat(list1(r), ll), lpost));
goto ret;
- case OAS2RECV:
- // a,b = <-c
- *init = concat(*init, n->ninit);
- n->ninit = nil;
- r = n->rlist->n;
- walkexprlistsafe(n->list, init);
- walkexpr(&r->left, init);
- fn = chanfn("chanrecv2", 2, r->left->type);
- r = mkcall1(fn, getoutargx(fn->type), init, r->left);
- n->rlist->n = r;
- n->op = OAS2FUNC;
- goto as2func;
-
case OAS2RECVCLOSED:
// a = <-c; b = closed(c) but atomic
*init = concat(*init, n->ninit);
n = mkcall1(chanfn("chansend1", 2, n->left->type), T, init, n->left, n->right);
goto ret;
- case OSENDNB:
- n = mkcall1(chanfn("chansend2", 2, n->left->type), n->type, init, n->left, n->right);
- goto ret;
-
case OCLOSURE:
n = walkclosure(n, init);
goto ret;
runtime·chansend(c, ae, nil);
}
-// chansend2(hchan *chan any, elem any) (pres bool);
-#pragma textflag 7
-void
-runtime·chansend2(Hchan* c, ...)
-{
- int32 o;
- byte *ae, *ap;
-
- if(c == nil)
- runtime·panicstring("send to nil channel");
-
- o = runtime·rnd(sizeof(c), c->elemalign);
- ae = (byte*)&c + o;
- o = runtime·rnd(o+c->elemsize, Structrnd);
- ap = (byte*)&c + o;
-
- runtime·chansend(c, ae, ap);
-}
-
// chanrecv1(hchan *chan any) (elem any);
#pragma textflag 7
void
runtime·chanrecv(c, ae, nil, nil);
}
-// chanrecv2(hchan *chan any) (elem any, pres bool);
-#pragma textflag 7
-void
-runtime·chanrecv2(Hchan* c, ...)
-{
- int32 o;
- byte *ae, *ap;
-
- if(c == nil)
- runtime·panicstring("receive from nil channel");
-
- o = runtime·rnd(sizeof(c), Structrnd);
- ae = (byte*)&c + o;
- o = runtime·rnd(o+c->elemsize, 1);
- ap = (byte*)&c + o;
-
- runtime·chanrecv(c, ae, ap, nil);
-
- if(!*ap)
- c->elemalg->copy(c->elemsize, ae, nil);
-}
-
// chanrecv3(hchan *chan any) (elem any, closed bool);
#pragma textflag 7
void
--- /dev/null
+// errchk $G -e $D/$F.go
+
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+var c chan int
+var v int
+
+func main() {
+ if c <- v { // ERROR "send statement.*value.*select"
+ }
+}
+
+var _ = c <- v // ERROR "send statement.*value.*select"