Source file
test/fixedbugs/issue15528.go
1
2
3
4
5
6
7 package main
8
9 import (
10 "fmt"
11 "io"
12 "os"
13 "reflect"
14 "unsafe"
15 )
16
17 type RWS struct{}
18
19 func (x *RWS) Read(p []byte) (n int, err error) { return }
20 func (x *RWS) Write(p []byte) (n int, err error) { return }
21 func (x *RWS) Seek(offset int64, whence int) (n int64, err error) { return }
22 func (x *RWS) String() string { return "rws" }
23
24 func makeRWS() io.ReadWriteSeeker { return &RWS{} }
25 func makeStringer() fmt.Stringer { return &RWS{} }
26
27
28 var efaces = [...]struct {
29 x interface{}
30 s string
31 }{
32 {nil, "<nil> <nil>"},
33 {1, "int 1"},
34 {int(1), "int 1"},
35 {Int(int(2)), "main.Int Int=2"},
36 {int(Int(3)), "int 3"},
37 {[1]int{2}, "[1]int [2]"},
38 {io.Reader(io.ReadWriter(io.ReadWriteSeeker(nil))), "<nil> <nil>"},
39 {io.Reader(io.ReadWriter(io.ReadWriteSeeker(&RWS{}))), "*main.RWS rws"},
40 {makeRWS(), "*main.RWS rws"},
41 {map[string]string{"here": "there"}, "map[string]string map[here:there]"},
42 {chan bool(nil), "chan bool <nil>"},
43 {unsafe.Pointer(uintptr(0)), "unsafe.Pointer <nil>"},
44 {(*byte)(nil), "*uint8 <nil>"},
45 {io.Writer((*os.File)(nil)), "*os.File <nil>"},
46 {(interface{})(io.Writer((*os.File)(nil))), "*os.File <nil>"},
47 {fmt.Stringer(Strunger(((*Int)(nil)))), "*main.Int <nil>"},
48 }
49
50 type Int int
51
52 func (i Int) String() string { return fmt.Sprintf("Int=%d", i) }
53 func (i Int) Strung() {}
54
55 type Strunger interface {
56 fmt.Stringer
57 Strung()
58 }
59
60
61 var ifaces = [...]struct {
62 x fmt.Stringer
63 s string
64 }{
65 {nil, "<nil> <nil> %!s(<nil>)"},
66 {Int(3), "main.Int 3 Int=3"},
67 {Int(int(Int(4))), "main.Int 4 Int=4"},
68 {Strunger(Int(5)), "main.Int 5 Int=5"},
69 {makeStringer(), "*main.RWS &main.RWS{} rws"},
70 {fmt.Stringer(nil), "<nil> <nil> %!s(<nil>)"},
71 {(*RWS)(nil), "*main.RWS (*main.RWS)(nil) rws"},
72 }
73
74
75 var (
76 one int = 1
77 iptr interface{} = &one
78 clos int
79 f interface{} = func() { clos++ }
80 deep interface{} = [1]struct{ a *[2]byte }{{a: &[2]byte{'z', 'w'}}}
81 ch interface{} = make(chan bool, 1)
82 )
83
84 func main() {
85 var fail bool
86 for i, test := range efaces {
87 s := fmt.Sprintf("%[1]T %[1]v", test.x)
88 if s != test.s {
89 fmt.Printf("eface(%d)=%q want %q\n", i, s, test.s)
90 fail = true
91 }
92 }
93
94 for i, test := range ifaces {
95 s := fmt.Sprintf("%[1]T %#[1]v %[1]s", test.x)
96 if s != test.s {
97 fmt.Printf("iface(%d)=%q want %q\n", i, s, test.s)
98 fail = true
99 }
100 }
101
102 if got := *(iptr.(*int)); got != 1 {
103 fmt.Printf("bad int ptr %d\n", got)
104 fail = true
105 }
106
107 f.(func())()
108 f.(func())()
109 f.(func())()
110 if clos != 3 {
111 fmt.Printf("bad closure exec %d\n", clos)
112 fail = true
113 }
114
115 if !reflect.DeepEqual(*(deep.([1]struct{ a *[2]byte })[0].a), [2]byte{'z', 'w'}) {
116 fmt.Printf("bad deep directiface\n")
117 fail = true
118 }
119
120 cc := ch.(chan bool)
121 cc <- true
122 if got := <-cc; !got {
123 fmt.Printf("bad chan\n")
124 fail = true
125 }
126
127 if fail {
128 fmt.Println("BUG")
129 os.Exit(1)
130 }
131 }
132
View as plain text