//+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 IR constant propagation } Jf(nil) // calls *D } func five(i I, j J) { jf := j.f if unknown { jf = nil // suppress IR 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