blob: af470a0d0d187fcc5ac237118c7b8a98ab6b8ce6 [file] [log] [blame]
Russ Cox0b477ef2012-02-16 23:48:57 -05001// run
Hector Chu47e60422011-07-18 16:15:01 -04002
3// Copyright 2011 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
Rob Pike3fb5f322012-02-19 17:44:02 +11007// Test for select: Issue 2075
Hector Chu47e60422011-07-18 16:15:01 -04008// A bug in select corrupts channel queues of failed cases
9// if there are multiple waiters on those channels and the
10// select is the last in the queue. If further waits are made
11// on the channel without draining it first then those waiters
12// will never wake up. In the code below c1 is such a channel.
13
14package main
15
16func main() {
17 c1 := make(chan bool)
18 c2 := make(chan bool)
19 c3 := make(chan bool)
20 go func() { <-c1 }()
21 go func() {
22 select {
23 case <-c1:
24 panic("dummy")
25 case <-c2:
26 c3 <- true
27 }
28 <-c1
29 }()
30 go func() { c2 <- true }()
31 <-c3
32 c1 <- true
33 c1 <- true
34}