]> Cypherpunks.ru repositories - gostls13.git/blob - test/method.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / test / method.go
1 // run
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 // Test simple methods of various types, with pointer and
8 // value receivers.
9
10 package main
11
12 type S string
13 type S1 string
14 type I int
15 type I1 int
16 type T struct {
17         x int
18 }
19 type T1 T
20
21 func (s S) val() int   { return 1 }
22 func (s *S1) val() int { return 2 }
23 func (i I) val() int   { return 3 }
24 func (i *I1) val() int { return 4 }
25 func (t T) val() int   { return 7 }
26 func (t *T1) val() int { return 8 }
27
28 type Val interface {
29         val() int
30 }
31
32 func val(v Val) int { return v.val() }
33
34 func main() {
35         var s S
36         var ps *S1
37         var i I
38         var pi *I1
39         var pt *T1
40         var t T
41         var v Val
42
43         if s.val() != 1 {
44                 println("s.val:", s.val())
45                 panic("fail")
46         }
47         if S.val(s) != 1 {
48                 println("S.val(s):", S.val(s))
49                 panic("fail")
50         }
51         if (*S).val(&s) != 1 {
52                 println("(*S).val(s):", (*S).val(&s))
53                 panic("fail")
54         }
55         if ps.val() != 2 {
56                 println("ps.val:", ps.val())
57                 panic("fail")
58         }
59         if (*S1).val(ps) != 2 {
60                 println("(*S1).val(ps):", (*S1).val(ps))
61                 panic("fail")
62         }
63         if i.val() != 3 {
64                 println("i.val:", i.val())
65                 panic("fail")
66         }
67         if I.val(i) != 3 {
68                 println("I.val(i):", I.val(i))
69                 panic("fail")
70         }
71         if (*I).val(&i) != 3 {
72                 println("(*I).val(&i):", (*I).val(&i))
73                 panic("fail")
74         }
75         if pi.val() != 4 {
76                 println("pi.val:", pi.val())
77                 panic("fail")
78         }
79         if (*I1).val(pi) != 4 {
80                 println("(*I1).val(pi):", (*I1).val(pi))
81                 panic("fail")
82         }
83         if t.val() != 7 {
84                 println("t.val:", t.val())
85                 panic("fail")
86         }
87         if pt.val() != 8 {
88                 println("pt.val:", pt.val())
89                 panic("fail")
90         }
91         if (*T1).val(pt) != 8 {
92                 println("(*T1).val(pt):", (*T1).val(pt))
93                 panic("fail")
94         }
95
96         if val(s) != 1 {
97                 println("val(s):", val(s))
98                 panic("fail")
99         }
100         if val(ps) != 2 {
101                 println("val(ps):", val(ps))
102                 panic("fail")
103         }
104         if val(i) != 3 {
105                 println("val(i):", val(i))
106                 panic("fail")
107         }
108         if val(pi) != 4 {
109                 println("val(pi):", val(pi))
110                 panic("fail")
111         }
112         if val(t) != 7 {
113                 println("val(t):", val(t))
114                 panic("fail")
115         }
116         if val(pt) != 8 {
117                 println("val(pt):", val(pt))
118                 panic("fail")
119         }
120
121         if Val.val(i) != 3 {
122                 println("Val.val(i):", Val.val(i))
123                 panic("fail")
124         }
125         v = i
126         if Val.val(v) != 3 {
127                 println("Val.val(v):", Val.val(v))
128                 panic("fail")
129         }
130
131         var zs struct{ S }
132         var zps struct{ *S1 }
133         var zi struct{ I }
134         var zpi struct{ *I1 }
135         var zpt struct{ *T1 }
136         var zt struct{ T }
137         var zv struct{ Val }
138
139         if zs.val() != 1 {
140                 println("zs.val:", zs.val())
141                 panic("fail")
142         }
143         if zps.val() != 2 {
144                 println("zps.val:", zps.val())
145                 panic("fail")
146         }
147         if zi.val() != 3 {
148                 println("zi.val:", zi.val())
149                 panic("fail")
150         }
151         if zpi.val() != 4 {
152                 println("zpi.val:", zpi.val())
153                 panic("fail")
154         }
155         if zt.val() != 7 {
156                 println("zt.val:", zt.val())
157                 panic("fail")
158         }
159         if zpt.val() != 8 {
160                 println("zpt.val:", zpt.val())
161                 panic("fail")
162         }
163
164         if val(zs) != 1 {
165                 println("val(zs):", val(zs))
166                 panic("fail")
167         }
168         if val(zps) != 2 {
169                 println("val(zps):", val(zps))
170                 panic("fail")
171         }
172         if val(zi) != 3 {
173                 println("val(zi):", val(zi))
174                 panic("fail")
175         }
176         if val(zpi) != 4 {
177                 println("val(zpi):", val(zpi))
178                 panic("fail")
179         }
180         if val(zt) != 7 {
181                 println("val(zt):", val(zt))
182                 panic("fail")
183         }
184         if val(zpt) != 8 {
185                 println("val(zpt):", val(zpt))
186                 panic("fail")
187         }
188
189         zv.Val = zi
190         if zv.val() != 3 {
191                 println("zv.val():", zv.val())
192                 panic("fail")
193         }
194
195         if (&zs).val() != 1 {
196                 println("(&zs).val:", (&zs).val())
197                 panic("fail")
198         }
199         if (&zps).val() != 2 {
200                 println("(&zps).val:", (&zps).val())
201                 panic("fail")
202         }
203         if (&zi).val() != 3 {
204                 println("(&zi).val:", (&zi).val())
205                 panic("fail")
206         }
207         if (&zpi).val() != 4 {
208                 println("(&zpi).val:", (&zpi).val())
209                 panic("fail")
210         }
211         if (&zt).val() != 7 {
212                 println("(&zt).val:", (&zt).val())
213                 panic("fail")
214         }
215         if (&zpt).val() != 8 {
216                 println("(&zpt).val:", (&zpt).val())
217                 panic("fail")
218         }
219
220         if val(&zs) != 1 {
221                 println("val(&zs):", val(&zs))
222                 panic("fail")
223         }
224         if val(&zps) != 2 {
225                 println("val(&zps):", val(&zps))
226                 panic("fail")
227         }
228         if val(&zi) != 3 {
229                 println("val(&zi):", val(&zi))
230                 panic("fail")
231         }
232         if val(&zpi) != 4 {
233                 println("val(&zpi):", val(&zpi))
234                 panic("fail")
235         }
236         if val(&zt) != 7 {
237                 println("val(&zt):", val(&zt))
238                 panic("fail")
239         }
240         if val(&zpt) != 8 {
241                 println("val(&zpt):", val(&zpt))
242                 panic("fail")
243         }
244
245         zv.Val = &zi
246         if zv.val() != 3 {
247                 println("zv.val():", zv.val())
248                 panic("fail")
249         }
250
251         promotion()
252 }
253
254 type A struct{ B }
255 type B struct {
256         C
257         *D
258 }
259 type C int
260
261 func (C) f()  {} // value receiver, direct field of A
262 func (*C) g() {} // pointer receiver
263
264 type D int
265
266 func (D) h()  {} // value receiver, indirect field of A
267 func (*D) i() {} // pointer receiver
268
269 func expectPanic() {
270         if r := recover(); r == nil {
271                 panic("expected nil dereference")
272         }
273 }
274
275 func promotion() {
276         var a A
277         // Addressable value receiver.
278         a.f()
279         a.g()
280         func() {
281                 defer expectPanic()
282                 a.h() // dynamic error: nil dereference in a.B.D->f()
283         }()
284         a.i()
285
286         // Non-addressable value receiver.
287         A(a).f()
288         // A(a).g() // static error: cannot call pointer method on A literal.B.C
289         func() {
290                 defer expectPanic()
291                 A(a).h() // dynamic error: nil dereference in A().B.D->f()
292         }()
293         A(a).i()
294
295         // Pointer receiver.
296         (&a).f()
297         (&a).g()
298         func() {
299                 defer expectPanic()
300                 (&a).h() // dynamic error: nil deref: nil dereference in (&a).B.D->f()
301         }()
302         (&a).i()
303
304         c := new(C)
305         c.f() // makes a copy
306         c.g()
307 }