mirror of
https://github.com/golang/go
synced 2024-10-04 15:09:59 +00:00
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
This commit is contained in:
parent
87af75ff74
commit
9414681972
|
@ -34,6 +34,10 @@ Faulting address: 0x0
|
|||
pc: xxx
|
||||
|
||||
|
||||
=========== ./interface6.go
|
||||
failure in f4 i
|
||||
BUG interface6
|
||||
|
||||
=========== ./peano.go
|
||||
0! = 1
|
||||
1! = 1
|
||||
|
|
150
test/interface6.go
Normal file
150
test/interface6.go
Normal file
|
@ -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)
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue