summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2009-01-15 10:15:34 -0800
committerIan Lance Taylor <iant@golang.org>2009-01-15 10:15:34 -0800
commitbd310bcb62632885584bd702ef52310e8b30ab91 (patch)
tree8c9d3f6f0912753f6cb14acee76bf7fb09ed3fd5
parenta775355fc6b3b2ddeb4296171f2f6fb0dbc19e48 (diff)
downloadgolang-bd310bcb62632885584bd702ef52310e8b30ab91.tar.gz
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
-rw-r--r--test/golden.out4
-rw-r--r--test/interface6.go150
2 files changed, 154 insertions, 0 deletions
diff --git a/test/golden.out b/test/golden.out
index 132286615..a74d96bcd 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 000000000..b4a14fb94
--- /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)
+ }
+}