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  }