Home | History | Annotate | Download | only in chan
      1 // errorcheck
      2 
      3 // Copyright 2009 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 various correct and incorrect permutations of send-only,
      8 // receive-only, and bidirectional channels.
      9 // Does not compile.
     10 
     11 package main
     12 
     13 var (
     14 	cr <-chan int
     15 	cs chan<- int
     16 	c  chan int
     17 )
     18 
     19 func main() {
     20 	cr = c  // ok
     21 	cs = c  // ok
     22 	c = cr  // ERROR "illegal types|incompatible|cannot"
     23 	c = cs  // ERROR "illegal types|incompatible|cannot"
     24 	cr = cs // ERROR "illegal types|incompatible|cannot"
     25 	cs = cr // ERROR "illegal types|incompatible|cannot"
     26 
     27 	c <- 0 // ok
     28 	<-c    // ok
     29 	x, ok := <-c	// ok
     30 	_, _ = x, ok
     31 
     32 	cr <- 0 // ERROR "send"
     33 	<-cr    // ok
     34 	x, ok = <-cr	// ok
     35 	_, _ = x, ok
     36 
     37 	cs <- 0 // ok
     38 	<-cs    // ERROR "receive"
     39 	x, ok = <-cs	// ERROR "receive"
     40 	_, _ = x, ok
     41 
     42 	select {
     43 	case c <- 0: // ok
     44 	case x := <-c: // ok
     45 		_ = x
     46 
     47 	case cr <- 0: // ERROR "send"
     48 	case x := <-cr: // ok
     49 		_ = x
     50 
     51 	case cs <- 0: // ok
     52 	case x := <-cs: // ERROR "receive"
     53 		_ = x
     54 	}
     55 
     56 	for _ = range cs {// ERROR "receive"
     57 	}
     58 
     59 	for range cs {// ERROR "receive"
     60 	}
     61 
     62 	close(c)
     63 	close(cs)
     64 	close(cr)  // ERROR "receive"
     65 }
     66