| // compile | |
| // Copyright 2014 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // Issue 6847: select clauses involving implicit conversion | |
| // of channels trigger a spurious typechecking error during walk. | |
| package p | |
| type I1 interface { | |
| String() | |
| } | |
| type I2 interface { | |
| String() | |
| } | |
| func F() { | |
| var ( | |
| cr <-chan int | |
| cs chan<- int | |
| c chan int | |
| ccr chan (<-chan int) | |
| ccs chan chan<- int | |
| cc chan chan int | |
| ok bool | |
| ) | |
| // Send cases. | |
| select { | |
| case ccr <- cr: | |
| case ccr <- c: | |
| } | |
| select { | |
| case ccs <- cs: | |
| case ccs <- c: | |
| } | |
| select { | |
| case ccr <- c: | |
| default: | |
| } | |
| // Receive cases. | |
| select { | |
| case cr = <-cc: | |
| case cs = <-cc: | |
| case c = <-cc: | |
| } | |
| select { | |
| case cr = <-cc: | |
| default: | |
| } | |
| select { | |
| case cr, ok = <-cc: | |
| case cs, ok = <-cc: | |
| case c = <-cc: | |
| } | |
| // Interfaces. | |
| var ( | |
| c1 chan I1 | |
| c2 chan I2 | |
| x1 I1 | |
| x2 I2 | |
| ) | |
| select { | |
| case c1 <- x1: | |
| case c1 <- x2: | |
| case c2 <- x1: | |
| case c2 <- x2: | |
| } | |
| select { | |
| case x1 = <-c1: | |
| case x1 = <-c2: | |
| case x2 = <-c1: | |
| case x2 = <-c2: | |
| } | |
| select { | |
| case x1, ok = <-c1: | |
| case x1, ok = <-c2: | |
| case x2, ok = <-c1: | |
| case x2, ok = <-c2: | |
| } | |
| _ = ok | |
| } |