From: Ian Lance Taylor Date: Thu, 15 Jan 2009 18:15:34 +0000 (-0800) Subject: Test that interfaces are correctly handled by pointer and by X-Git-Tag: weekly.2009-11-06~2378 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=94146819729000c50caa89015e458abed7405b77;p=gostls13.git Test that interfaces are correctly handled by pointer and by value for large and small objects. Currently one case fails with 6g. R=rsc DELTA=150 (150 added, 0 deleted, 0 changed) OCL=22823 CL=22827 --- diff --git a/test/golden.out b/test/golden.out index 132286615f..a74d96bcd4 100644 --- a/test/golden.out +++ b/test/golden.out @@ -34,6 +34,10 @@ Faulting address: 0x0 pc: xxx +=========== ./interface6.go +failure in f4 i +BUG interface6 + =========== ./peano.go 0! = 1 1! = 1 diff --git a/test/interface6.go b/test/interface6.go new file mode 100644 index 0000000000..b4a14fb943 --- /dev/null +++ b/test/interface6.go @@ -0,0 +1,150 @@ +// $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) + } +}