aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/internal/synctest/synctest_test.go40
-rw-r--r--src/runtime/chan.go3
2 files changed, 43 insertions, 0 deletions
diff --git a/src/internal/synctest/synctest_test.go b/src/internal/synctest/synctest_test.go
index c0e126e3fc..7c8fd7ef9e 100644
--- a/src/internal/synctest/synctest_test.go
+++ b/src/internal/synctest/synctest_test.go
@@ -263,6 +263,46 @@ func TestChannelFromOutsideBubble(t *testing.T) {
}
}
+func TestChannelMovedOutOfBubble(t *testing.T) {
+ for _, test := range []struct {
+ desc string
+ f func(chan struct{})
+ wantPanic string
+ }{{
+ desc: "receive",
+ f: func(ch chan struct{}) {
+ <-ch
+ },
+ wantPanic: "receive on synctest channel from outside bubble",
+ }, {
+ desc: "send",
+ f: func(ch chan struct{}) {
+ ch <- struct{}{}
+ },
+ wantPanic: "send on synctest channel from outside bubble",
+ }, {
+ desc: "close",
+ f: func(ch chan struct{}) {
+ close(ch)
+ },
+ wantPanic: "close of synctest channel from outside bubble",
+ }} {
+ t.Run(test.desc, func(t *testing.T) {
+ donec := make(chan struct{})
+ ch := make(chan chan struct{})
+ go func() {
+ defer close(donec)
+ defer wantPanic(t, test.wantPanic)
+ test.f(<-ch)
+ }()
+ synctest.Run(func() {
+ ch <- make(chan struct{})
+ })
+ <-donec
+ })
+ }
+}
+
func TestTimerFromInsideBubble(t *testing.T) {
for _, test := range []struct {
desc string
diff --git a/src/runtime/chan.go b/src/runtime/chan.go
index cb2737d096..63d8044b44 100644
--- a/src/runtime/chan.go
+++ b/src/runtime/chan.go
@@ -415,6 +415,9 @@ func closechan(c *hchan) {
if c == nil {
panic(plainError("close of nil channel"))
}
+ if c.synctest && getg().bubble == nil {
+ panic(plainError("close of synctest channel from outside bubble"))
+ }
lock(&c.lock)
if c.closed != 0 {