1 // Copyright 2012 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 5 // method declarations 6 7 package decls2 8 9 import "time" 10 import "unsafe" 11 12 // T1 declared before its methods. 13 type T1 struct{ 14 f int 15 } 16 17 func (T1) m() {} 18 func (T1) m /* ERROR "already declared" */ () {} 19 func (x *T1) f /* ERROR "field and method with the same name f" */ () {} 20 21 // Conflict between embedded field and method name, 22 // with the embedded field being a basic type. 23 type T1b struct { 24 int 25 } 26 27 func (T1b) int /* ERROR "field and method" */ () {} 28 29 type T1c struct { 30 time.Time 31 } 32 33 func (T1c) Time /* ERROR "field and method with the same name Time" */ () int { return 0 } 34 35 // Disabled for now: LookupFieldOrMethod will find Pointer even though 36 // it's double-declared (it would cost extra in the common case to verify 37 // this). But the MethodSet computation will not find it due to the name 38 // collision caused by the double-declaration, leading to an internal 39 // inconsistency while we are verifying one computation against the other. 40 // var _ = T1c{}.Pointer 41 42 // T2's method declared before the type. 43 func (*T2) f /* ERROR "field and method" */ () {} 44 45 type T2 struct { 46 f int 47 } 48 49 // Methods declared without a declared type. 50 func (undefined /* ERROR "undefined" */) m() {} 51 func (x *undefined /* ERROR "undefined" */) m() {} 52 53 func (pi /* ERROR "not a type" */) m1() {} 54 func (x pi /* ERROR "not a type" */) m2() {} 55 func (x *pi /* ERROR "not a type" */ ) m3() {} 56 57 // Blank types. 58 type _ struct { m int } 59 type _ struct { m int } 60 61 func (_ /* ERROR "cannot use _" */) m() {} 62 func m(_ /* ERROR "cannot use _" */) {} 63 64 // Methods with receiver base type declared in another file. 65 func (T3) m1() {} 66 func (*T3) m2() {} 67 func (x T3) m3() {} 68 func (x *T3) f /* ERROR "field and method" */ () {} 69 70 // Methods of non-struct type. 71 type T4 func() 72 73 func (self T4) m() func() { return self } 74 75 // Methods associated with an interface. 76 type T5 interface { 77 m() int 78 } 79 80 func (T5 /* ERROR "invalid receiver" */ ) m1() {} 81 func (T5 /* ERROR "invalid receiver" */ ) m2() {} 82 83 // Methods associated with a named pointer type. 84 type ptr *int 85 func (ptr /* ERROR "invalid receiver" */ ) _() {} 86 func (* /* ERROR "invalid receiver" */ ptr) _() {} 87 88 // Methods with zero or multiple receivers. 89 func ( /* ERROR "method has no receiver" */ ) _() {} 90 func (T3, * /* ERROR "method has multiple receivers" */ T3) _() {} 91 func (T3, T3, T3 /* ERROR "method has multiple receivers" */ ) _() {} 92 func (a, b /* ERROR "method has multiple receivers" */ T3) _() {} 93 func (a, b, c /* ERROR "method has multiple receivers" */ T3) _() {} 94 95 // Methods associated with non-local or unnamed types. 96 func (int /* ERROR "cannot define new methods on non-local type int" */ ) m() {} 97 func ([ /* ERROR "invalid receiver" */ ]int) m() {} 98 func (time /* ERROR "cannot define new methods on non-local type time.Time" */ .Time) m() {} 99 func (* /* ERROR "cannot define new methods on non-local type time.Time" */ time.Time) m() {} 100 func (x /* ERROR "invalid receiver" */ interface{}) m() {} 101 102 // Unsafe.Pointer is treated like a pointer when used as receiver type. 103 type UP unsafe.Pointer 104 func (UP /* ERROR "invalid" */ ) m1() {} 105 func (* /* ERROR "invalid" */ UP) m2() {} 106 107 // Double declarations across package files 108 const c_double = 0 109 type t_double int 110 var v_double int 111 func f_double() {} 112