blob: 9b35c56acfd4deed50375ee0840ce042d65a82f3 [file] [log] [blame]
Russ Coxd2cc9882012-02-16 23:50:37 -05001// run
Ken Thompson24eb30b2008-10-25 15:26:35 -07002
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
Rob Pikeeb37b5b2012-02-24 16:24:24 +11007// Test embedded fields of structs, including methods.
8
Ken Thompson24eb30b2008-10-25 15:26:35 -07009package main
10
11
Rob Pike325cf8e2010-03-24 16:46:53 -070012type I interface {
13 test1() int
14 test2() int
15 test3() int
16 test4() int
17 test5() int
18 test6() int
19 test7() int
20}
Ken Thompson24eb30b2008-10-25 15:26:35 -070021
22/******
23 ******
24 ******/
25
Rob Pike325cf8e2010-03-24 16:46:53 -070026type SubpSubp struct {
27 a7 int
28 a int
Ken Thompson24eb30b2008-10-25 15:26:35 -070029}
Rob Pike325cf8e2010-03-24 16:46:53 -070030
Robert Griesemer581530e2009-12-10 12:53:23 -080031func (p *SubpSubp) test7() int {
Rob Pike325cf8e2010-03-24 16:46:53 -070032 if p.a != p.a7 {
33 println("SubpSubp", p, p.a7)
34 panic("fail")
35 }
Ken Thompson24eb30b2008-10-25 15:26:35 -070036 return p.a
37}
Rob Pike325cf8e2010-03-24 16:46:53 -070038func (p *SubpSubp) testx() { println("SubpSubp", p, p.a7) }
Ken Thompson24eb30b2008-10-25 15:26:35 -070039
40/******
41 ******
42 ******/
43
Rob Pike325cf8e2010-03-24 16:46:53 -070044type SubpSub struct {
45 a6 int
46 SubpSubp
47 a int
Ken Thompson24eb30b2008-10-25 15:26:35 -070048}
Rob Pike325cf8e2010-03-24 16:46:53 -070049
Robert Griesemer581530e2009-12-10 12:53:23 -080050func (p *SubpSub) test6() int {
Rob Pike325cf8e2010-03-24 16:46:53 -070051 if p.a != p.a6 {
52 println("SubpSub", p, p.a6)
53 panic("fail")
54 }
Ken Thompson24eb30b2008-10-25 15:26:35 -070055 return p.a
56}
Rob Pike325cf8e2010-03-24 16:46:53 -070057func (p *SubpSub) testx() { println("SubpSub", p, p.a6) }
Ken Thompson24eb30b2008-10-25 15:26:35 -070058
59/******
60 ******
61 ******/
62
Rob Pike325cf8e2010-03-24 16:46:53 -070063type SubSubp struct {
64 a5 int
65 a int
Ken Thompson24eb30b2008-10-25 15:26:35 -070066}
Rob Pike325cf8e2010-03-24 16:46:53 -070067
Robert Griesemer581530e2009-12-10 12:53:23 -080068func (p *SubSubp) test5() int {
Rob Pike325cf8e2010-03-24 16:46:53 -070069 if p.a != p.a5 {
70 println("SubpSub", p, p.a5)
71 panic("fail")
72 }
Ken Thompson24eb30b2008-10-25 15:26:35 -070073 return p.a
74}
75
76/******
77 ******
78 ******/
79
Rob Pike325cf8e2010-03-24 16:46:53 -070080type SubSub struct {
81 a4 int
82 a int
Ken Thompson24eb30b2008-10-25 15:26:35 -070083}
Rob Pike325cf8e2010-03-24 16:46:53 -070084
Robert Griesemer581530e2009-12-10 12:53:23 -080085func (p *SubSub) test4() int {
Rob Pike325cf8e2010-03-24 16:46:53 -070086 if p.a != p.a4 {
87 println("SubpSub", p, p.a4)
88 panic("fail")
89 }
Ken Thompson24eb30b2008-10-25 15:26:35 -070090 return p.a
91}
92
93/******
94 ******
95 ******/
96
Rob Pike325cf8e2010-03-24 16:46:53 -070097type Subp struct {
98 a3 int
99 *SubpSubp
100 SubpSub
101 a int
Ken Thompson24eb30b2008-10-25 15:26:35 -0700102}
Rob Pike325cf8e2010-03-24 16:46:53 -0700103
Robert Griesemer581530e2009-12-10 12:53:23 -0800104func (p *Subp) test3() int {
Rob Pike325cf8e2010-03-24 16:46:53 -0700105 if p.a != p.a3 {
106 println("SubpSub", p, p.a3)
107 panic("fail")
108 }
Ken Thompson24eb30b2008-10-25 15:26:35 -0700109 return p.a
110}
111
112/******
113 ******
114 ******/
115
Rob Pike325cf8e2010-03-24 16:46:53 -0700116type Sub struct {
117 a2 int
118 *SubSubp
119 SubSub
120 a int
Ken Thompson24eb30b2008-10-25 15:26:35 -0700121}
Rob Pike325cf8e2010-03-24 16:46:53 -0700122
Robert Griesemer581530e2009-12-10 12:53:23 -0800123func (p *Sub) test2() int {
Rob Pike325cf8e2010-03-24 16:46:53 -0700124 if p.a != p.a2 {
125 println("SubpSub", p, p.a2)
126 panic("fail")
127 }
Ken Thompson24eb30b2008-10-25 15:26:35 -0700128 return p.a
129}
130
131/******
132 ******
133 ******/
134
Rob Pike325cf8e2010-03-24 16:46:53 -0700135type S struct {
136 a1 int
137 Sub
138 *Subp
139 a int
Ken Thompson24eb30b2008-10-25 15:26:35 -0700140}
Rob Pike325cf8e2010-03-24 16:46:53 -0700141
Robert Griesemer581530e2009-12-10 12:53:23 -0800142func (p *S) test1() int {
Rob Pike325cf8e2010-03-24 16:46:53 -0700143 if p.a != p.a1 {
144 println("SubpSub", p, p.a1)
145 panic("fail")
146 }
Ken Thompson24eb30b2008-10-25 15:26:35 -0700147 return p.a
148}
149
150/******
151 ******
152 ******/
153
Rob Pike325cf8e2010-03-24 16:46:53 -0700154func main() {
155 var i I
156 var s *S
Ken Thompson24eb30b2008-10-25 15:26:35 -0700157
158 // allocate
Rob Pike325cf8e2010-03-24 16:46:53 -0700159 s = new(S)
160 s.Subp = new(Subp)
161 s.Sub.SubSubp = new(SubSubp)
162 s.Subp.SubpSubp = new(SubpSubp)
Ken Thompson24eb30b2008-10-25 15:26:35 -0700163
164 // explicit assignment
Rob Pike325cf8e2010-03-24 16:46:53 -0700165 s.a = 1
166 s.Sub.a = 2
167 s.Subp.a = 3
168 s.Sub.SubSub.a = 4
169 s.Sub.SubSubp.a = 5
170 s.Subp.SubpSub.a = 6
171 s.Subp.SubpSubp.a = 7
Ken Thompson24eb30b2008-10-25 15:26:35 -0700172
173 // embedded (unique) assignment
Rob Pike325cf8e2010-03-24 16:46:53 -0700174 s.a1 = 1
175 s.a2 = 2
176 s.a3 = 3
177 s.a4 = 4
178 s.a5 = 5
179 s.a6 = 6
180 s.a7 = 7
Ken Thompson24eb30b2008-10-25 15:26:35 -0700181
182 // unique calls with explicit &
Rob Pike325cf8e2010-03-24 16:46:53 -0700183 if s.test1() != 1 {
184 println("t1", 1)
185 panic("fail")
186 }
187 if (&s.Sub).test2() != 2 {
188 println("t1", 2)
189 panic("fail")
190 }
191 if s.Subp.test3() != 3 {
192 println("t1", 3)
193 panic("fail")
194 }
195 if (&s.Sub.SubSub).test4() != 4 {
196 println("t1", 4)
197 panic("fail")
198 }
199 if s.Sub.SubSubp.test5() != 5 {
200 println("t1", 5)
201 panic("fail")
202 }
203 if (&s.Subp.SubpSub).test6() != 6 {
204 println("t1", 6)
205 panic("fail")
206 }
207 if s.Subp.SubpSubp.test7() != 7 {
208 println("t1", 7)
209 panic("fail")
210 }
Ken Thompson24eb30b2008-10-25 15:26:35 -0700211
212 // automatic &
Rob Pike325cf8e2010-03-24 16:46:53 -0700213 if s.Sub.test2() != 2 {
214 println("t2", 2)
215 panic("fail")
216 }
217 if s.Sub.SubSub.test4() != 4 {
218 println("t2", 4)
219 panic("fail")
220 }
221 if s.Subp.SubpSub.test6() != 6 {
222 println("t2", 6)
223 panic("fail")
224 }
Ken Thompson24eb30b2008-10-25 15:26:35 -0700225
226 // embedded calls
Rob Pike325cf8e2010-03-24 16:46:53 -0700227 if s.test1() != s.a1 {
228 println("t3", 1)
229 panic("fail")
230 }
231 if s.test2() != s.a2 {
232 println("t3", 2)
233 panic("fail")
234 }
235 if s.test3() != s.a3 {
236 println("t3", 3)
237 panic("fail")
238 }
239 if s.test4() != s.a4 {
240 println("t3", 4)
241 panic("fail")
242 }
243 if s.test5() != s.a5 {
244 println("t3", 5)
245 panic("fail")
246 }
247 if s.test6() != s.a6 {
248 println("t3", 6)
249 panic("fail")
250 }
251 if s.test7() != s.a7 {
252 println("t3", 7)
253 panic("fail")
254 }
Ken Thompson24eb30b2008-10-25 15:26:35 -0700255
256 // run it thru an interface
Rob Pike325cf8e2010-03-24 16:46:53 -0700257 i = s
258 s = i.(*S)
Ken Thompson24eb30b2008-10-25 15:26:35 -0700259
260 // same as t3
Rob Pike325cf8e2010-03-24 16:46:53 -0700261 if s.test1() != s.a1 {
262 println("t4", 1)
263 panic("fail")
264 }
265 if s.test2() != s.a2 {
266 println("t4", 2)
267 panic("fail")
268 }
269 if s.test3() != s.a3 {
270 println("t4", 3)
271 panic("fail")
272 }
273 if s.test4() != s.a4 {
274 println("t4", 4)
275 panic("fail")
276 }
277 if s.test5() != s.a5 {
278 println("t4", 5)
279 panic("fail")
280 }
281 if s.test6() != s.a6 {
282 println("t4", 6)
283 panic("fail")
284 }
285 if s.test7() != s.a7 {
286 println("t4", 7)
287 panic("fail")
288 }
Ken Thompson24eb30b2008-10-25 15:26:35 -0700289
290 // call interface
Rob Pike325cf8e2010-03-24 16:46:53 -0700291 if i.test1() != s.test1() {
292 println("t5", 1)
293 panic("fail")
294 }
295 if i.test2() != s.test2() {
296 println("t5", 2)
297 panic("fail")
298 }
299 if i.test3() != s.test3() {
300 println("t5", 3)
301 panic("fail")
302 }
303 if i.test4() != s.test4() {
304 println("t5", 4)
305 panic("fail")
306 }
307 if i.test5() != s.test5() {
308 println("t5", 5)
309 panic("fail")
310 }
311 if i.test6() != s.test6() {
312 println("t5", 6)
313 panic("fail")
314 }
315 if i.test7() != s.test7() {
316 println("t5", 7)
317 panic("fail")
318 }
Ken Thompson24eb30b2008-10-25 15:26:35 -0700319}