+++ /dev/null
-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()
-}