1// errorcheck
2
3// Copyright 2016 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// Check the compiler's switch handling that happens
8// at typechecking time.
9// This must be separate from other checks,
10// because errors during typechecking
11// prevent other errors from being discovered.
12
13package main
14
15// Verify that type switch statements with impossible cases are detected by the compiler.
16func f0(e error) {
17	switch e.(type) {
18	case int: // ERROR "impossible type switch case: (int\n\t)?e \(.*type error\) cannot have dynamic type int \(missing method Error\)"
19	}
20}
21
22// Verify that the compiler rejects multiple default cases.
23func f1(e interface{}) {
24	switch e {
25	default:
26	default: // ERROR "multiple defaults( in switch)?"
27	}
28	switch e.(type) {
29	default:
30	default: // ERROR "multiple defaults( in switch)?"
31	}
32}
33
34type I interface {
35	Foo()
36}
37
38type X int
39
40func (*X) Foo() {}
41func f2() {
42	var i I
43	switch i.(type) {
44	case X: // ERROR "impossible type switch case: (X\n\t)?i \(.*type I\) cannot have dynamic type X \(method Foo has pointer receiver\)"
45	}
46}
47