package main // Tests of method promotion logic. type A struct{ magic int } func (a A) x() { if a.magic != 1 { panic(a.magic) } } func (a *A) y() *A { return a } type B struct{ magic int } func (b B) p() { if b.magic != 2 { panic(b.magic) } } func (b *B) q() { if b != theC.B { panic("oops") } } type I interface { f() } type impl struct{ magic int } func (i impl) f() { if i.magic != 3 { panic("oops") } } type C struct { A *B I } func assert(cond bool) { if !cond { panic("failed") } } var theC = C{ A: A{1}, B: &B{2}, I: impl{3}, } func addr() *C { return &theC } func value() C { return theC } func main() { // address addr().x() if addr().y() != &theC.A { panic("oops") } addr().p() addr().q() addr().f() // addressable value var c C = value() c.x() if c.y() != &c.A { panic("oops") } c.p() c.q() c.f() // non-addressable value value().x() // value().y() // not in method set value().p() value().q() value().f() }