66 lines
965 B
Go
66 lines
965 B
Go
//+build ignore
|
|
|
|
package main
|
|
|
|
// Test of interface calls. None of the concrete types are ever
|
|
// instantiated or converted to interfaces.
|
|
|
|
type I interface {
|
|
f()
|
|
}
|
|
|
|
type J interface {
|
|
f()
|
|
g()
|
|
}
|
|
|
|
type C int // implements I
|
|
|
|
func (*C) f()
|
|
|
|
type D int // implements I and J
|
|
|
|
func (*D) f()
|
|
func (*D) g()
|
|
|
|
func one(i I, j J) {
|
|
i.f() // calls *C and *D
|
|
}
|
|
|
|
func two(i I, j J) {
|
|
j.f() // calls *D (but not *C, even though it defines method f)
|
|
}
|
|
|
|
func three(i I, j J) {
|
|
j.g() // calls *D
|
|
}
|
|
|
|
func four(i I, j J) {
|
|
Jf := J.f
|
|
if unknown {
|
|
Jf = nil // suppress SSA constant propagation
|
|
}
|
|
Jf(nil) // calls *D
|
|
}
|
|
|
|
func five(i I, j J) {
|
|
jf := j.f
|
|
if unknown {
|
|
jf = nil // suppress SSA constant propagation
|
|
}
|
|
jf() // calls *D
|
|
}
|
|
|
|
var unknown bool
|
|
|
|
// WANT:
|
|
// Dynamic calls
|
|
// (J).f$bound --> (*D).f
|
|
// (J).f$thunk --> (*D).f
|
|
// five --> (J).f$bound
|
|
// four --> (J).f$thunk
|
|
// one --> (*C).f
|
|
// one --> (*D).f
|
|
// three --> (*D).g
|
|
// two --> (*D).f
|