Source file test/interface/explicit.go
1 // errorcheck 2 3 // Copyright 2009 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 // Verify compiler messages about erroneous static interface conversions. 8 // Does not compile. 9 10 package main 11 12 type T struct { 13 a int 14 } 15 16 var t *T 17 18 type X int 19 20 func (x *X) M() {} 21 22 type I interface { 23 M() 24 } 25 26 var i I 27 28 type I2 interface { 29 M() 30 N() 31 } 32 33 var i2 I2 34 35 type E interface{} 36 37 var e E 38 39 func main() { 40 e = t // ok 41 t = e // ERROR "need explicit|need type assertion" 42 43 // neither of these can work, 44 // because i has an extra method 45 // that t does not, so i cannot contain a t. 46 i = t // ERROR "incompatible|missing method M" 47 t = i // ERROR "incompatible|assignment$" 48 49 i = i2 // ok 50 i2 = i // ERROR "incompatible|missing method N" 51 52 i = I(i2) // ok 53 i2 = I2(i) // ERROR "invalid|missing N method|cannot convert" 54 55 e = E(t) // ok 56 t = T(e) // ERROR "need explicit|need type assertion|incompatible|cannot convert" 57 58 // cannot type-assert non-interfaces 59 f := 2.0 60 _ = f.(int) // ERROR "non-interface type|only valid for interface types|not an interface" 61 62 } 63 64 type M interface { 65 M() 66 } 67 68 var m M 69 70 var _ = m.(int) // ERROR "impossible type assertion" 71 72 type Int int 73 74 func (Int) M(float64) {} 75 76 var _ = m.(Int) // ERROR "impossible type assertion" 77 78 var _ = m.(X) // ERROR "pointer receiver" 79 80 var ii int 81 var jj Int 82 83 var m1 M = ii // ERROR "incompatible|missing" 84 var m2 M = jj // ERROR "incompatible|wrong type for method M" 85 86 var m3 = M(ii) // ERROR "invalid|missing|cannot convert" 87 var m4 = M(jj) // ERROR "invalid|wrong type for M method|cannot convert" 88 89 type B1 interface { 90 _() // ERROR "methods must have a unique non-blank name" 91 } 92 93 type B2 interface { 94 M() 95 _() // ERROR "methods must have a unique non-blank name" 96 } 97 98 type T2 struct{} 99 100 func (t *T2) M() {} 101 func (t *T2) _() {} 102 103 // Already reported about the invalid blank interface method above; 104 // no need to report about not implementing it. 105 var b1 B1 = &T2{} 106 var b2 B2 = &T2{} 107