Commit 3f19d8ae authored by Russ Cox's avatar Russ Cox

gc: empty select

R=ken2
CC=golang-dev
https://golang.org/cl/1871057
parent 585eae3b
......@@ -68,8 +68,6 @@ typecheckselect(Node *sel)
typechecklist(ncase->nbody, Etop);
}
sel->xoffset = count;
if(count == 0)
yyerror("empty select");
lineno = lno;
}
......@@ -91,7 +89,7 @@ walkselect(Node *sel)
typecheck(&r, Etop);
init = list(init, r);
if(sel->list == nil)
if(sel->list == nil && sel->xoffset != 0)
fatal("double walkselect"); // already rewrote
// register cases
......
......@@ -631,9 +631,11 @@ void
printf("select: sel=%p\n", sel);
if(sel->ncase < 2) {
if(sel->ncase < 1)
throw("select: no cases");
// make special case of one.
if(sel->ncase < 1) {
g->status = Gwaiting; // forever
gosched();
}
// TODO: make special case of one.
}
// select a (relative) prime
......
......@@ -112,38 +112,33 @@ func main() {
<-ch
})
// TODO(gri) remove this if once 6g accepts empty selects
enabled := false
if enabled {
// empty selects always block
testBlock(always, func() {
select {
case <-make(chan int): // remove this once 6g accepts empty selects
}
})
// empty selects always block
testBlock(always, func() {
select {
}
})
// selects with only nil channels always block
testBlock(always, func() {
select {
case <-nilch:
unreachable()
}
})
testBlock(always, func() {
select {
case nilch <- 7:
unreachable()
}
})
testBlock(always, func() {
select {
case <-nilch:
unreachable()
case nilch <- 7:
unreachable()
}
})
}
// selects with only nil channels always block
testBlock(always, func() {
select {
case <-nilch:
unreachable()
}
})
testBlock(always, func() {
select {
case nilch <- 7:
unreachable()
}
})
testBlock(always, func() {
select {
case <-nilch:
unreachable()
case nilch <- 7:
unreachable()
}
})
// selects with non-ready non-nil channels always block
testBlock(always, func() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment