mirror of
https://github.com/golang/go
synced 2024-11-21 18:04:40 -07:00
parent
585eae3bce
commit
3f19d8ae8d
@ -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() {
|
||||
|
Loading…
Reference in New Issue
Block a user