1// Copyright 2019 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package main
6
7import "./embed0"
8
9type X1 struct{}
10
11func (X1) Foo() {}
12
13type X2 struct{}
14
15func (X2) foo() {}
16
17type X3 struct{}
18
19func (X3) foo(int) {}
20
21type X4 struct{ p.M1 }
22
23type X5 struct{ p.M1 }
24
25func (X5) foo(int) {}
26
27type X6 struct{ p.M2 }
28
29type X7 struct{ p.M2 }
30
31func (X7) foo() {}
32
33type X8 struct{ p.M2 }
34
35func (X8) foo(int) {}
36
37func main() {
38	var i1 interface{} = X1{}
39	check(func() { _ = i1.(p.I1) }, "interface conversion: main.X1 is not p.I1: missing method Foo")
40
41	var i2 interface{} = X2{}
42	check(func() { _ = i2.(p.I2) }, "interface conversion: main.X2 is not p.I2: missing method foo")
43
44	var i3 interface{} = X3{}
45	check(func() { _ = i3.(p.I2) }, "interface conversion: main.X3 is not p.I2: missing method foo")
46
47	var i4 interface{} = X4{}
48	check(func() { _ = i4.(p.I2) }, "interface conversion: main.X4 is not p.I2: missing method foo")
49
50	var i5 interface{} = X5{}
51	check(func() { _ = i5.(p.I2) }, "interface conversion: main.X5 is not p.I2: missing method foo")
52
53	var i6 interface{} = X6{}
54	check(func() { _ = i6.(p.I2) }, "")
55
56	var i7 interface{} = X7{}
57	check(func() { _ = i7.(p.I2) }, "")
58
59	var i8 interface{} = X8{}
60	check(func() { _ = i8.(p.I2) }, "")
61}
62
63func check(f func(), msg string) {
64	defer func() {
65		v := recover()
66		if v == nil {
67			if msg == "" {
68				return
69			}
70			panic("did not panic")
71		}
72		got := v.(error).Error()
73		if msg != got {
74			panic("want '" + msg + "', got '" + got + "'")
75		}
76	}()
77	f()
78}
79