--- /dev/null
+package pkg
+
+import "io"
+
+type T struct{}
+
+func (T) Read(b []byte) (int, error) { return 0, nil }
+func (T) something() string { return "non-exported method" }
+
+type V error
+type U error
+
+func fn1() {
+ var (
+ v interface{}
+ err error
+ )
+
+ switch v.(type) {
+ case io.Reader:
+ println("io.Reader")
+ case io.ReadCloser: // want `unreachable case clause: io\.Reader will always match before io\.ReadCloser`
+ println("io.ReadCloser")
+ }
+
+ switch v.(type) {
+ case io.Reader:
+ println("io.Reader")
+ case T: // want `unreachable case clause: io\.Reader will always match before CheckUnreachableTypeCases\.T`
+ println("T")
+ }
+
+ switch v.(type) {
+ case io.Reader:
+ println("io.Reader")
+ case io.ReadCloser: // want `unreachable case clause: io\.Reader will always match before io\.ReadCloser`
+ println("io.ReadCloser")
+ case T: // want `unreachable case clause: io\.Reader will always match before CheckUnreachableTypeCases\.T`
+ println("T")
+ }
+
+ switch v.(type) {
+ case io.Reader:
+ println("io.Reader")
+ case io.ReadCloser, T: // want `unreachable case clause: io\.Reader will always match before io\.ReadCloser`
+ println("io.ReadCloser or T")
+ }
+
+ switch v.(type) {
+ case io.ReadCloser, io.Reader:
+ println("io.ReadCloser or io.Reader")
+ case T: // want `unreachable case clause: io\.Reader will always match before CheckUnreachableTypeCases\.T`
+ println("T")
+ }
+
+ switch v.(type) {
+ default:
+ println("something else")
+ case io.Reader:
+ println("io.Reader")
+ case T: // want `unreachable case clause: io\.Reader will always match before CheckUnreachableTypeCases\.T`
+ println("T")
+ }
+
+ switch err.(type) {
+ case V:
+ println("V")
+ case U: // want `unreachable case clause: CheckUnreachableTypeCases\.V will always match before CheckUnreachableTypeCases\.U`
+ println("U")
+ }
+
+ switch err.(type) {
+ case U:
+ println("U")
+ case V: // want `unreachable case clause: CheckUnreachableTypeCases\.U will always match before CheckUnreachableTypeCases\.V`
+ println("V")
+ }
+}
+
+func fn3() {
+ var (
+ v interface{}
+ err error
+ )
+
+ switch v.(type) {
+ case T:
+ println("T")
+ case io.Reader:
+ println("io.Reader")
+ }
+
+ switch v.(type) {
+ case io.ReadCloser:
+ println("io.ReadCloser")
+ case T:
+ println("T")
+ }
+
+ switch v.(type) {
+ case io.ReadCloser:
+ println("io.ReadCloser")
+ case io.Reader:
+ println("io.Reader")
+ }
+
+ switch v.(type) {
+ case T:
+ println("T")
+ }
+
+ switch err.(type) {
+ case V, U:
+ println("V or U")
+ case io.Reader:
+ println("io.Reader")
+ }
+
+ switch v.(type) {
+ default:
+ println("something")
+ }
+}