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 interface values containing structures.
8
9package main
10
11import "os"
12
13var fail int
14
15func check(b bool, msg string) {
16	if (!b) {
17		println("failure in", msg)
18		fail++
19	}
20}
21
22type I1 interface { Get() int; Put(int) }
23
24type S1 struct { i int }
25func (p S1) Get() int { return p.i }
26func (p S1) Put(i int) { p.i = i }
27
28func f1() {
29	s := S1{1}
30	var i I1 = s
31	i.Put(2)
32	check(i.Get() == 1, "f1 i")
33	check(s.i == 1, "f1 s")
34}
35
36func f2() {
37	s := S1{1}
38	var i I1 = &s
39	i.Put(2)
40	check(i.Get() == 1, "f2 i")
41	check(s.i == 1, "f2 s")
42}
43
44func f3() {
45	s := &S1{1}
46	var i I1 = s
47	i.Put(2)
48	check(i.Get() == 1, "f3 i")
49	check(s.i == 1, "f3 s")
50}
51
52type S2 struct { i int }
53func (p *S2) Get() int { return p.i }
54func (p *S2) Put(i int) { p.i = i }
55
56// Disallowed by restriction of values going to pointer receivers
57// func f4() {
58//	 s := S2{1}
59//	 var i I1 = s
60//	 i.Put(2)
61//	 check(i.Get() == 2, "f4 i")
62//	 check(s.i == 1, "f4 s")
63// }
64
65func f5() {
66	s := S2{1}
67	var i I1 = &s
68	i.Put(2)
69	check(i.Get() == 2, "f5 i")
70	check(s.i == 2, "f5 s")
71}
72
73func f6() {
74	s := &S2{1}
75	var i I1 = s
76	i.Put(2)
77	check(i.Get() == 2, "f6 i")
78	check(s.i == 2, "f6 s")
79}
80
81type I2 interface { Get() int64; Put(int64) }
82
83type S3 struct { i, j, k, l int64 }
84func (p S3) Get() int64 { return p.l }
85func (p S3) Put(i int64) { p.l = i }
86
87func f7() {
88	s := S3{1, 2, 3, 4}
89	var i I2 = s
90	i.Put(5)
91	check(i.Get() == 4, "f7 i")
92	check(s.l == 4, "f7 s")
93}
94
95func f8() {
96	s := S3{1, 2, 3, 4}
97	var i I2 = &s
98	i.Put(5)
99	check(i.Get() == 4, "f8 i")
100	check(s.l == 4, "f8 s")
101}
102
103func f9() {
104	s := &S3{1, 2, 3, 4}
105	var i I2 = s
106	i.Put(5)
107	check(i.Get() == 4, "f9 i")
108	check(s.l == 4, "f9 s")
109}
110
111type S4 struct { i, j, k, l int64 }
112func (p *S4) Get() int64 { return p.l }
113func (p *S4) Put(i int64) { p.l = i }
114
115// Disallowed by restriction of values going to pointer receivers
116// func f10() {
117//	 s := S4{1, 2, 3, 4}
118//	 var i I2 = s
119//	 i.Put(5)
120//	 check(i.Get() == 5, "f10 i")
121//	 check(s.l == 4, "f10 s")
122// }
123
124func f11() {
125	s := S4{1, 2, 3, 4}
126	var i I2 = &s
127	i.Put(5)
128	check(i.Get() == 5, "f11 i")
129	check(s.l == 5, "f11 s")
130}
131
132func f12() {
133	s := &S4{1, 2, 3, 4}
134	var i I2 = s
135	i.Put(5)
136	check(i.Get() == 5, "f12 i")
137	check(s.l == 5, "f12 s")
138}
139
140func main() {
141	f1()
142	f2()
143	f3()
144//	f4()
145	f5()
146	f6()
147	f7()
148	f8()
149	f9()
150//	f10()
151	f11()
152	f12()
153	if fail > 0 {
154		os.Exit(1)
155	}
156}
157