// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG interface6 // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package main var fail int func check(b bool, msg string) { if (!b) { println("failure in", msg); fail++; } } type I1 interface { Get() int; Put(int); } type S1 struct { i int } func (p S1) Get() int { return p.i } func (p S1) Put(i int) { p.i = i } func f1() { s := S1{1}; var i I1 = s; i.Put(2); check(i.Get() == 1, "f1 i"); check(s.i == 1, "f1 s"); } func f2() { s := S1{1}; var i I1 = &s; i.Put(2); check(i.Get() == 1, "f2 i"); check(s.i == 1, "f2 s"); } func f3() { s := &S1{1}; var i I1 = s; i.Put(2); check(i.Get() == 1, "f3 i"); check(s.i == 1, "f3 s"); } type S2 struct { i int } func (p *S2) Get() int { return p.i } func (p *S2) Put(i int) { p.i = i } // func f4() { // s := S2{1}; // var i I1 = s; // i.Put(2); // check(i.Get() == 2, "f4 i"); // check(s.i == 1, "f4 s"); // } func f5() { s := S2{1}; var i I1 = &s; i.Put(2); check(i.Get() == 2, "f5 i"); check(s.i == 2, "f5 s"); } func f6() { s := &S2{1}; var i I1 = s; i.Put(2); check(i.Get() == 2, "f6 i"); check(s.i == 2, "f6 s"); } type I2 interface { Get() int64; Put(int64); } type S3 struct { i, j, k, l int64 } func (p S3) Get() int64 { return p.l } func (p S3) Put(i int64) { p.l = i } func f7() { s := S3{1, 2, 3, 4}; var i I2 = s; i.Put(5); check(i.Get() == 4, "f7 i"); check(s.l == 4, "f7 s"); } func f8() { s := S3{1, 2, 3, 4}; var i I2 = &s; i.Put(5); check(i.Get() == 4, "f8 i"); check(s.l == 4, "f8 s"); } func f9() { s := &S3{1, 2, 3, 4}; var i I2 = s; i.Put(5); check(i.Get() == 4, "f9 i"); check(s.l == 4, "f9 s"); } type S4 struct { i, j, k, l int64 } func (p *S4) Get() int64 { return p.l } func (p *S4) Put(i int64) { p.l = i } // func f10() { // s := S4{1, 2, 3, 4}; // var i I2 = s; // i.Put(5); // check(i.Get() == 5, "f10 i"); // check(s.l == 4, "f10 s"); // } func f11() { s := S4{1, 2, 3, 4}; var i I2 = &s; i.Put(5); check(i.Get() == 5, "f11 i"); check(s.l == 5, "f11 s"); } func f12() { s := &S4{1, 2, 3, 4}; var i I2 = s; i.Put(5); check(i.Get() == 5, "f12 i"); check(s.l == 5, "f12 s"); } func main() { f1(); f2(); f3(); // f4(); f5(); f6(); f7(); f8(); f9(); // f10(); f11(); f12(); if fail > 0 { sys.Exit(1) } }