summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2011-03-23 21:13:57 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2011-03-23 21:13:57 +0000
commitc994e9c029bf8f058b64c60f1cda5f07075a5823 (patch)
tree4d857e22ad7943fcdeeebd79414e85dc2eb195ba /gcc
parent86b41e677631c924d3c4fde98138c896b01ed6f4 (diff)
downloadgcc-c994e9c029bf8f058b64c60f1cda5f07075a5823.tar.gz
Send on a closed channel panics.
Calling close on a closed channel panics. Don't limit number of receives on a closed channel. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@171364 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/go.test/test/chan/select3.go14
-rw-r--r--gcc/testsuite/go.test/test/closedchan.go18
2 files changed, 17 insertions, 15 deletions
diff --git a/gcc/testsuite/go.test/test/chan/select3.go b/gcc/testsuite/go.test/test/chan/select3.go
index a1a2ef50b56..9877b12a98c 100644
--- a/gcc/testsuite/go.test/test/chan/select3.go
+++ b/gcc/testsuite/go.test/test/chan/select3.go
@@ -97,13 +97,9 @@ func main() {
}
})
- // sending (a small number of times) to a closed channel is not specified
- // but the current implementation doesn't block: test that different
- // implementations behave the same
- testBlock(never, func() {
- for i := 0; i < 10; i++ {
- closedch <- 7
- }
+ // sending to a closed channel panics.
+ testPanic(always, func() {
+ closedch <- 7
})
// receiving from a non-ready channel always blocks
@@ -189,13 +185,13 @@ func main() {
}
})
- // selects with closed channels don't block
+ // selects with closed channels behave like ordinary operations
testBlock(never, func() {
select {
case <-closedch:
}
})
- testBlock(never, func() {
+ testPanic(always, func() {
select {
case closedch <- 7:
}
diff --git a/gcc/testsuite/go.test/test/closedchan.go b/gcc/testsuite/go.test/test/closedchan.go
index c7c759be3b3..8126d5a4e4c 100644
--- a/gcc/testsuite/go.test/test/closedchan.go
+++ b/gcc/testsuite/go.test/test/closedchan.go
@@ -100,6 +100,15 @@ func (c SChan) Impl() string {
return "(select)"
}
+func shouldPanic(f func()) {
+ defer func() {
+ if recover() == nil {
+ panic("did not panic")
+ }
+ }()
+ f()
+}
+
func test1(c Chan) {
// not closed until the close signal (a zero value) has been received.
if c.Closed() {
@@ -128,18 +137,15 @@ func test1(c Chan) {
}
// send should work with ,ok too: sent a value without blocking, so ok == true.
- ok := c.Nbsend(1)
- if !ok {
- println("test1: send on closed got not ok", c.Impl())
- }
+ shouldPanic(func(){c.Nbsend(1)})
- // but the value should have been discarded.
+ // the value should have been discarded.
if x := c.Recv(); x != 0 {
println("test1: recv on closed got non-zero after send on closed:", x, c.Impl())
}
// similarly Send.
- c.Send(2)
+ shouldPanic(func(){c.Send(2)})
if x := c.Recv(); x != 0 {
println("test1: recv on closed got non-zero after send on closed:", x, c.Impl())
}