80 lines
1.2 KiB
Go
80 lines
1.2 KiB
Go
//+build ignore
|
|
|
|
package main
|
|
|
|
// Test of interface calls.
|
|
|
|
func use(interface{})
|
|
|
|
type A byte // instantiated but not a reflect type
|
|
|
|
func (A) f() {} // called directly
|
|
func (A) F() {} // unreachable
|
|
|
|
type B int // a reflect type
|
|
|
|
func (*B) f() {} // reachable via interface invoke
|
|
func (*B) F() {} // reachable: exported method of reflect type
|
|
|
|
type B2 int // a reflect type, and *B2 also
|
|
|
|
func (B2) f() {} // reachable via interface invoke
|
|
func (B2) g() {} // reachable: exported method of reflect type
|
|
|
|
type C string // not instantiated
|
|
|
|
func (C) f() {} // unreachable
|
|
func (C) F() {} // unreachable
|
|
|
|
type D uint // instantiated only in dead code
|
|
|
|
func (D) f() {} // unreachable
|
|
func (D) F() {} // unreachable
|
|
|
|
func main() {
|
|
A(0).f()
|
|
|
|
use(new(B))
|
|
use(B2(0))
|
|
|
|
var i interface {
|
|
f()
|
|
}
|
|
i.f() // calls (*B).f, (*B2).f and (B2.f)
|
|
|
|
live()
|
|
}
|
|
|
|
func live() {
|
|
var j interface {
|
|
f()
|
|
g()
|
|
}
|
|
j.f() // calls (B2).f and (*B2).f but not (*B).f (no g method).
|
|
}
|
|
|
|
func dead() {
|
|
use(D(0))
|
|
}
|
|
|
|
// WANT:
|
|
// Dynamic calls
|
|
// live --> (*B2).f
|
|
// live --> (B2).f
|
|
// main --> (*B).f
|
|
// main --> (*B2).f
|
|
// main --> (B2).f
|
|
// Reachable functions
|
|
// (*B).F
|
|
// (*B).f
|
|
// (*B2).f
|
|
// (A).f
|
|
// (B2).f
|
|
// live
|
|
// use
|
|
// Reflect types
|
|
// *B
|
|
// *B2
|
|
// B
|
|
// B2
|