Commit 94146819 authored by Ian Lance Taylor's avatar Ian Lance Taylor

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
parent 87af75ff
......@@ -34,6 +34,10 @@ Faulting address: 0x0
pc: xxx
=========== ./interface6.go
failure in f4 i
BUG interface6
=========== ./peano.go
0! = 1
1! = 1
......
// $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)
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment