blob: f60819ca8116f24c77132cc8a3cb6676ff76b922 [file] [log] [blame]
Rémy Oudompheng2ece2f52012-02-18 22:15:42 +01001// run
Ian Lance Taylor94146812009-01-15 10:15:34 -08002
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 Pike13514d42012-02-19 17:33:41 +11007// Test interface values containing structures.
Russ Coxc7d30bc2009-05-12 16:09:47 -07008
Ian Lance Taylor94146812009-01-15 10:15:34 -08009package main
10
Russ Cox918afd942009-05-08 15:21:41 -070011import "os"
12
Ian Lance Taylor94146812009-01-15 10:15:34 -080013var fail int
14
15func check(b bool, msg string) {
Rob Pike74dd0ab2009-08-17 13:30:22 -070016 if (!b) {
Rob Pike4f61fc92010-09-04 10:36:13 +100017 println("failure in", msg)
18 fail++
Rob Pike74dd0ab2009-08-17 13:30:22 -070019 }
Ian Lance Taylor94146812009-01-15 10:15:34 -080020}
21
Rob Pike4f61fc92010-09-04 10:36:13 +100022type I1 interface { Get() int; Put(int) }
Ian Lance Taylor94146812009-01-15 10:15:34 -080023
Russ Cox839a6842009-01-20 14:40:40 -080024type S1 struct { i int }
Ian Lance Taylor94146812009-01-15 10:15:34 -080025func (p S1) Get() int { return p.i }
26func (p S1) Put(i int) { p.i = i }
27
28func f1() {
Rob Pike4f61fc92010-09-04 10:36:13 +100029 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")
Ian Lance Taylor94146812009-01-15 10:15:34 -080034}
35
36func f2() {
Rob Pike4f61fc92010-09-04 10:36:13 +100037 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")
Ian Lance Taylor94146812009-01-15 10:15:34 -080042}
43
44func f3() {
Rob Pike4f61fc92010-09-04 10:36:13 +100045 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")
Ian Lance Taylor94146812009-01-15 10:15:34 -080050}
51
Russ Cox839a6842009-01-20 14:40:40 -080052type S2 struct { i int }
Ian Lance Taylor94146812009-01-15 10:15:34 -080053func (p *S2) Get() int { return p.i }
54func (p *S2) Put(i int) { p.i = i }
55
Rob Pike36ccbbd2009-10-19 11:54:59 -070056// Disallowed by restriction of values going to pointer receivers
Russ Cox4eb7ceba52009-03-11 16:06:17 -070057// func f4() {
Rob Pike4f61fc92010-09-04 10:36:13 +100058// 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")
Russ Cox4eb7ceba52009-03-11 16:06:17 -070063// }
Ian Lance Taylor94146812009-01-15 10:15:34 -080064
65func f5() {
Rob Pike4f61fc92010-09-04 10:36:13 +100066 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")
Ian Lance Taylor94146812009-01-15 10:15:34 -080071}
72
73func f6() {
Rob Pike4f61fc92010-09-04 10:36:13 +100074 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")
Ian Lance Taylor94146812009-01-15 10:15:34 -080079}
80
Rob Pike4f61fc92010-09-04 10:36:13 +100081type I2 interface { Get() int64; Put(int64) }
Ian Lance Taylor94146812009-01-15 10:15:34 -080082
Russ Cox839a6842009-01-20 14:40:40 -080083type S3 struct { i, j, k, l int64 }
Ian Lance Taylor94146812009-01-15 10:15:34 -080084func (p S3) Get() int64 { return p.l }
85func (p S3) Put(i int64) { p.l = i }
86
87func f7() {
Rob Pike4f61fc92010-09-04 10:36:13 +100088 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")
Ian Lance Taylor94146812009-01-15 10:15:34 -080093}
94
95func f8() {
Rob Pike4f61fc92010-09-04 10:36:13 +100096 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")
Ian Lance Taylor94146812009-01-15 10:15:34 -0800101}
102
103func f9() {
Rob Pike4f61fc92010-09-04 10:36:13 +1000104 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")
Ian Lance Taylor94146812009-01-15 10:15:34 -0800109}
110
Russ Cox839a6842009-01-20 14:40:40 -0800111type S4 struct { i, j, k, l int64 }
Ian Lance Taylor94146812009-01-15 10:15:34 -0800112func (p *S4) Get() int64 { return p.l }
113func (p *S4) Put(i int64) { p.l = i }
114
Rob Pike36ccbbd2009-10-19 11:54:59 -0700115// Disallowed by restriction of values going to pointer receivers
Russ Cox4eb7ceba52009-03-11 16:06:17 -0700116// func f10() {
Rob Pike4f61fc92010-09-04 10:36:13 +1000117// 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")
Russ Cox4eb7ceba52009-03-11 16:06:17 -0700122// }
Ian Lance Taylor94146812009-01-15 10:15:34 -0800123
124func f11() {
Rob Pike4f61fc92010-09-04 10:36:13 +1000125 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")
Ian Lance Taylor94146812009-01-15 10:15:34 -0800130}
131
132func f12() {
Rob Pike4f61fc92010-09-04 10:36:13 +1000133 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")
Ian Lance Taylor94146812009-01-15 10:15:34 -0800138}
139
140func main() {
Rob Pike4f61fc92010-09-04 10:36:13 +1000141 f1()
142 f2()
143 f3()
144// f4()
145 f5()
146 f6()
147 f7()
148 f8()
149 f9()
150// f10()
151 f11()
152 f12()
Rob Pike74dd0ab2009-08-17 13:30:22 -0700153 if fail > 0 {
154 os.Exit(1)
155 }
Ian Lance Taylor94146812009-01-15 10:15:34 -0800156}