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