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