1
0
mirror of https://github.com/golang/go synced 2024-11-22 00:44:39 -07:00

gc: empty select

R=ken2
CC=golang-dev
https://golang.org/cl/1871057
This commit is contained in:
Russ Cox 2010-08-03 01:07:57 -07:00
parent 585eae3bce
commit 3f19d8ae8d
3 changed files with 32 additions and 37 deletions

View File

@ -68,8 +68,6 @@ typecheckselect(Node *sel)
typechecklist(ncase->nbody, Etop); typechecklist(ncase->nbody, Etop);
} }
sel->xoffset = count; sel->xoffset = count;
if(count == 0)
yyerror("empty select");
lineno = lno; lineno = lno;
} }
@ -91,7 +89,7 @@ walkselect(Node *sel)
typecheck(&r, Etop); typecheck(&r, Etop);
init = list(init, r); init = list(init, r);
if(sel->list == nil) if(sel->list == nil && sel->xoffset != 0)
fatal("double walkselect"); // already rewrote fatal("double walkselect"); // already rewrote
// register cases // register cases

View File

@ -631,9 +631,11 @@ void
printf("select: sel=%p\n", sel); printf("select: sel=%p\n", sel);
if(sel->ncase < 2) { if(sel->ncase < 2) {
if(sel->ncase < 1) if(sel->ncase < 1) {
throw("select: no cases"); g->status = Gwaiting; // forever
// make special case of one. gosched();
}
// TODO: make special case of one.
} }
// select a (relative) prime // select a (relative) prime

View File

@ -112,38 +112,33 @@ func main() {
<-ch <-ch
}) })
// TODO(gri) remove this if once 6g accepts empty selects // empty selects always block
enabled := false testBlock(always, func() {
if enabled { select {
// empty selects always block }
testBlock(always, func() { })
select {
case <-make(chan int): // remove this once 6g accepts empty selects
}
})
// selects with only nil channels always block // selects with only nil channels always block
testBlock(always, func() { testBlock(always, func() {
select { select {
case <-nilch: case <-nilch:
unreachable() unreachable()
} }
}) })
testBlock(always, func() { testBlock(always, func() {
select { select {
case nilch <- 7: case nilch <- 7:
unreachable() unreachable()
} }
}) })
testBlock(always, func() { testBlock(always, func() {
select { select {
case <-nilch: case <-nilch:
unreachable() unreachable()
case nilch <- 7: case nilch <- 7:
unreachable() unreachable()
} }
}) })
}
// selects with non-ready non-nil channels always block // selects with non-ready non-nil channels always block
testBlock(always, func() { testBlock(always, func() {