github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/go/callgraph/cha/testdata/iface.go (about) 1 // +build ignore 2 3 package main 4 5 // Test of interface calls. None of the concrete types are ever 6 // instantiated or converted to interfaces. 7 8 type I interface { 9 f() 10 } 11 12 type J interface { 13 f() 14 g() 15 } 16 17 type C int // implements I 18 19 func (*C) f() 20 21 type D int // implements I and J 22 23 func (*D) f() 24 func (*D) g() 25 26 func one(i I, j J) { 27 i.f() // calls *C and *D 28 } 29 30 func two(i I, j J) { 31 j.f() // calls *D (but not *C, even though it defines method f) 32 } 33 34 func three(i I, j J) { 35 j.g() // calls *D 36 } 37 38 func four(i I, j J) { 39 Jf := J.f 40 if unknown { 41 Jf = nil // suppress SSA constant propagation 42 } 43 Jf(nil) // calls *D 44 } 45 46 func five(i I, j J) { 47 jf := j.f 48 if unknown { 49 jf = nil // suppress SSA constant propagation 50 } 51 jf() // calls *D 52 } 53 54 var unknown bool 55 56 // WANT: 57 // Dynamic calls 58 // (J).f$bound --> (*D).f 59 // (J).f$thunk --> (*D).f 60 // five --> (J).f$bound 61 // four --> (J).f$thunk 62 // one --> (*C).f 63 // one --> (*D).f 64 // three --> (*D).g 65 // two --> (*D).f