| // Copyright 2013 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package methodsets |
| |
| type T0 struct {} |
| |
| func (T0) v0() {} |
| func (*T0) p0() {} |
| |
| type T1 struct {} // like T0 with different method names |
| |
| func (T1) v1() {} |
| func (*T1) p1() {} |
| |
| type T2 interface { |
| v2() |
| p2() |
| } |
| |
| type T3 struct { |
| T0 |
| *T1 |
| T2 |
| } |
| |
| // Method expressions |
| func _() { |
| var ( |
| _ func(T0) = T0.v0 |
| _ = T0.p0 /* ERROR "cannot call pointer method p0 on T0" */ |
| |
| _ func (*T0) = (*T0).v0 |
| _ func (*T0) = (*T0).p0 |
| |
| // T1 is like T0 |
| |
| _ func(T2) = T2.v2 |
| _ func(T2) = T2.p2 |
| |
| _ func(T3) = T3.v0 |
| _ func(T3) = T3.p0 /* ERROR "cannot call pointer method p0 on T3" */ |
| _ func(T3) = T3.v1 |
| _ func(T3) = T3.p1 |
| _ func(T3) = T3.v2 |
| _ func(T3) = T3.p2 |
| |
| _ func(*T3) = (*T3).v0 |
| _ func(*T3) = (*T3).p0 |
| _ func(*T3) = (*T3).v1 |
| _ func(*T3) = (*T3).p1 |
| _ func(*T3) = (*T3).v2 |
| _ func(*T3) = (*T3).p2 |
| ) |
| } |
| |
| // Method values with addressable receivers |
| func _() { |
| var ( |
| v0 T0 |
| _ func() = v0.v0 |
| _ func() = v0.p0 |
| ) |
| |
| var ( |
| p0 *T0 |
| _ func() = p0.v0 |
| _ func() = p0.p0 |
| ) |
| |
| // T1 is like T0 |
| |
| var ( |
| v2 T2 |
| _ func() = v2.v2 |
| _ func() = v2.p2 |
| ) |
| |
| var ( |
| v4 T3 |
| _ func() = v4.v0 |
| _ func() = v4.p0 |
| _ func() = v4.v1 |
| _ func() = v4.p1 |
| _ func() = v4.v2 |
| _ func() = v4.p2 |
| ) |
| |
| var ( |
| p4 *T3 |
| _ func() = p4.v0 |
| _ func() = p4.p0 |
| _ func() = p4.v1 |
| _ func() = p4.p1 |
| _ func() = p4.v2 |
| _ func() = p4.p2 |
| ) |
| } |
| |
| // Method calls with addressable receivers |
| func _() { |
| var v0 T0 |
| v0.v0() |
| v0.p0() |
| |
| var p0 *T0 |
| p0.v0() |
| p0.p0() |
| |
| // T1 is like T0 |
| |
| var v2 T2 |
| v2.v2() |
| v2.p2() |
| |
| var v4 T3 |
| v4.v0() |
| v4.p0() |
| v4.v1() |
| v4.p1() |
| v4.v2() |
| v4.p2() |
| |
| var p4 *T3 |
| p4.v0() |
| p4.p0() |
| p4.v1() |
| p4.p1() |
| p4.v2() |
| p4.p2() |
| } |
| |
| // Method values with value receivers |
| func _() { |
| var ( |
| _ func() = T0{}.v0 |
| _ func() = T0{}.p0 /* ERROR "cannot call pointer method p0 on T0" */ |
| |
| _ func() = (&T0{}).v0 |
| _ func() = (&T0{}).p0 |
| |
| // T1 is like T0 |
| |
| // no values for T2 |
| |
| _ func() = T3{}.v0 |
| _ func() = T3{}.p0 /* ERROR "cannot call pointer method p0 on T3" */ |
| _ func() = T3{}.v1 |
| _ func() = T3{}.p1 |
| _ func() = T3{}.v2 |
| _ func() = T3{}.p2 |
| |
| _ func() = (&T3{}).v0 |
| _ func() = (&T3{}).p0 |
| _ func() = (&T3{}).v1 |
| _ func() = (&T3{}).p1 |
| _ func() = (&T3{}).v2 |
| _ func() = (&T3{}).p2 |
| ) |
| } |
| |
| // Method calls with value receivers |
| func _() { |
| T0{}.v0() |
| T0{}.p0 /* ERROR "cannot call pointer method p0 on T0" */ () |
| |
| (&T0{}).v0() |
| (&T0{}).p0() |
| |
| // T1 is like T0 |
| |
| // no values for T2 |
| |
| T3{}.v0() |
| T3{}.p0 /* ERROR "cannot call pointer method p0 on T3" */ () |
| T3{}.v1() |
| T3{}.p1() |
| T3{}.v2() |
| T3{}.p2() |
| |
| (&T3{}).v0() |
| (&T3{}).p0() |
| (&T3{}).v1() |
| (&T3{}).p1() |
| (&T3{}).v2() |
| (&T3{}).p2() |
| } |
| |
| // *T has no methods if T is an interface type |
| func issue5918() { |
| var ( |
| err error |
| _ = err.Error() |
| _ func() string = err.Error |
| _ func(error) string = error.Error |
| |
| perr = &err |
| _ = perr.Error /* ERROR "no field or method" */ () |
| _ func() string = perr.Error /* ERROR "no field or method" */ |
| _ func(*error) string = (*error).Error /* ERROR "no field or method" */ |
| ) |
| |
| type T *interface{ m() int } |
| var ( |
| x T |
| _ = (*x).m() |
| _ = (*x).m |
| |
| _ = x.m /* ERROR "no field or method" */ () |
| _ = x.m /* ERROR "no field or method" */ |
| _ = T.m /* ERROR "no field or method" */ |
| ) |
| } |