1
0
mirror of https://github.com/golang/go synced 2024-10-01 12:28:37 -06:00
go/ssa/interp/testdata/methprom.go
Alan Donovan ae8016313d go.tools/ssa: tests of method promotion and of interface conversion + bugfixes.
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
2013-07-26 21:49:27 -04:00

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()
}