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