1
2
3
4
5
6
7
8
9 package main
10
11 import "os"
12
13 const Value = 1e12
14
15 type Inter interface {
16 M() int64
17 }
18
19 type T int64
20
21 func (t T) M() int64 { return int64(t) }
22
23 var t = T(Value)
24 var pt = &t
25 var ti Inter = t
26 var pti = &ti
27
28 type S struct{ Inter }
29
30 var s = S{ti}
31 var ps = &s
32
33 type SP struct{ *Inter }
34
35 var i Inter
36 var pi = &i
37
38 var ok = true
39
40 func check(s string, v int64) {
41 if v != Value {
42 println(s, v)
43 ok = false
44 }
45 }
46
47 func main() {
48 check("t.M()", t.M())
49 check("pt.M()", pt.M())
50 check("ti.M()", ti.M())
51 check("pti.M()", pti.M())
52 check("s.M()", s.M())
53 check("ps.M()", ps.M())
54
55 i = t
56 check("i = t; i.M()", i.M())
57 check("i = t; pi.M()", pi.M())
58
59 i = pt
60 check("i = pt; i.M()", i.M())
61 check("i = pt; pi.M()", pi.M())
62
63 i = s
64 check("i = s; i.M()", i.M())
65 check("i = s; pi.M()", pi.M())
66
67 i = ps
68 check("i = ps; i.M()", i.M())
69 check("i = ps; pi.M()", pi.M())
70
71 if !ok {
72 println("BUG: interface10")
73 os.Exit(1)
74 }
75 }
76
View as plain text