1// Copyright 2013 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 methodsets
6
7type T0 struct {}
8
9func (T0) v0() {}
10func (*T0) p0() {}
11
12type T1 struct {} // like T0 with different method names
13
14func (T1) v1() {}
15func (*T1) p1() {}
16
17type T2 interface {
18	v2()
19	p2()
20}
21
22type T3 struct {
23	T0
24	*T1
25	T2
26}
27
28// Method expressions
29func _() {
30	var (
31		_ func(T0) = T0.v0
32		_ = T0.p0 /* ERROR "cannot call pointer method p0 on T0" */
33
34		_ func (*T0) = (*T0).v0
35		_ func (*T0) = (*T0).p0
36
37		// T1 is like T0
38
39		_ func(T2) = T2.v2
40		_ func(T2) = T2.p2
41
42		_ func(T3) = T3.v0
43		_ func(T3) = T3.p0 /* ERROR "cannot call pointer method p0 on T3" */
44		_ func(T3) = T3.v1
45		_ func(T3) = T3.p1
46		_ func(T3) = T3.v2
47		_ func(T3) = T3.p2
48
49		_ func(*T3) = (*T3).v0
50		_ func(*T3) = (*T3).p0
51		_ func(*T3) = (*T3).v1
52		_ func(*T3) = (*T3).p1
53		_ func(*T3) = (*T3).v2
54		_ func(*T3) = (*T3).p2
55	)
56}
57
58// Method values with addressable receivers
59func _() {
60	var (
61		v0 T0
62		_ func() = v0.v0
63		_ func() = v0.p0
64	)
65
66	var (
67		p0 *T0
68		_ func() = p0.v0
69		_ func() = p0.p0
70	)
71
72	// T1 is like T0
73
74	var (
75		v2 T2
76		_ func() = v2.v2
77		_ func() = v2.p2
78	)
79
80	var (
81		v4 T3
82		_ func() = v4.v0
83		_ func() = v4.p0
84		_ func() = v4.v1
85		_ func() = v4.p1
86		_ func() = v4.v2
87		_ func() = v4.p2
88	)
89
90	var (
91		p4 *T3
92		_ func() = p4.v0
93		_ func() = p4.p0
94		_ func() = p4.v1
95		_ func() = p4.p1
96		_ func() = p4.v2
97		_ func() = p4.p2
98	)
99}
100
101// Method calls with addressable receivers
102func _() {
103	var v0 T0
104	v0.v0()
105	v0.p0()
106
107	var p0 *T0
108	p0.v0()
109	p0.p0()
110
111	// T1 is like T0
112
113	var v2 T2
114	v2.v2()
115	v2.p2()
116
117	var v4 T3
118	v4.v0()
119	v4.p0()
120	v4.v1()
121	v4.p1()
122	v4.v2()
123	v4.p2()
124
125	var p4 *T3
126	p4.v0()
127	p4.p0()
128	p4.v1()
129	p4.p1()
130	p4.v2()
131	p4.p2()
132}
133
134// Method values with value receivers
135func _() {
136	var (
137		_ func() = T0{}.v0
138		_ func() = T0{}.p0 /* ERROR "cannot call pointer method p0 on T0" */
139
140		_ func() = (&T0{}).v0
141		_ func() = (&T0{}).p0
142
143		// T1 is like T0
144
145		// no values for T2
146
147		_ func() = T3{}.v0
148		_ func() = T3{}.p0 /* ERROR "cannot call pointer method p0 on T3" */
149		_ func() = T3{}.v1
150		_ func() = T3{}.p1
151		_ func() = T3{}.v2
152		_ func() = T3{}.p2
153
154		_ func() = (&T3{}).v0
155		_ func() = (&T3{}).p0
156		_ func() = (&T3{}).v1
157		_ func() = (&T3{}).p1
158		_ func() = (&T3{}).v2
159		_ func() = (&T3{}).p2
160	)
161}
162
163// Method calls with value receivers
164func _() {
165	T0{}.v0()
166	T0{}.p0 /* ERROR "cannot call pointer method p0 on T0" */ ()
167
168	(&T0{}).v0()
169	(&T0{}).p0()
170
171	// T1 is like T0
172
173	// no values for T2
174
175	T3{}.v0()
176	T3{}.p0 /* ERROR "cannot call pointer method p0 on T3" */ ()
177	T3{}.v1()
178	T3{}.p1()
179	T3{}.v2()
180	T3{}.p2()
181
182	(&T3{}).v0()
183	(&T3{}).p0()
184	(&T3{}).v1()
185	(&T3{}).p1()
186	(&T3{}).v2()
187	(&T3{}).p2()
188}
189
190// *T has no methods if T is an interface type
191func issue5918() {
192	var (
193		err error
194		_ = err.Error()
195		_ func() string = err.Error
196		_ func(error) string = error.Error
197
198		perr = &err
199		_ = perr.Error /* ERROR "no field or method" */ ()
200		_ func() string = perr.Error /* ERROR "no field or method" */
201		_ func(*error) string = (*error).Error /* ERROR "no field or method" */
202	)
203
204	type T *interface{ m() int }
205	var (
206		x T
207		_ = (*x).m()
208		_ = (*x).m
209
210		_ = x.m /* ERROR "no field or method" */ ()
211		_ = x.m /* ERROR "no field or method" */
212		_ = T.m /* ERROR "no field or method" */
213	)
214}
215