mirror of
https://github.com/golang/go
synced 2024-11-19 08:34:39 -07:00
ae8016313d
methprom.go covers method promotion. Found bug: receiver() requires a following load under some circumstances. ifaceconv.go covers interface conversion. Found bug: confusion about infallible and fallible conversions led to use of TypeAssert in emitConv, which should never fail. Changed semantics of ChangeInterface to make it infallible and made some simplifications. Also in this CL: - SelectState.Pos now records the position of the the '<-' operator for sends/receives done by a Select. R=gri CC=golang-dev https://golang.org/cl/11931044
94 lines
990 B
Go
94 lines
990 B
Go
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()
|
|
}
|