|  | // 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 | 
|  | } |