github.com/epfl-dcsl/gotee@v0.0.0-20200909122901-014b35f5e5e9/test/chan/select6.go (about) 1 // run 2 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 7 // Test for select: Issue 2075 8 // 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 14 package main 15 16 func 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 }