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