mirror of
https://github.com/golang/go
synced 2024-11-19 09:44:46 -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
84 lines
1.3 KiB
Go
84 lines
1.3 KiB
Go
package main
|
|
|
|
// Tests of interface conversions and type assertions.
|
|
|
|
type I0 interface {
|
|
}
|
|
type I1 interface {
|
|
f()
|
|
}
|
|
type I2 interface {
|
|
f()
|
|
g()
|
|
}
|
|
|
|
type C0 struct{}
|
|
type C1 struct{}
|
|
|
|
func (C1) f() {}
|
|
|
|
type C2 struct{}
|
|
|
|
func (C2) f() {}
|
|
func (C2) g() {}
|
|
|
|
func main() {
|
|
var i0 I0
|
|
var i1 I1
|
|
var i2 I2
|
|
|
|
// Nil always causes a type assertion to fail, even to the
|
|
// same type.
|
|
if _, ok := i0.(I0); ok {
|
|
panic("nil i0.(I0) succeeded")
|
|
}
|
|
if _, ok := i1.(I1); ok {
|
|
panic("nil i1.(I1) succeeded")
|
|
}
|
|
if _, ok := i2.(I2); ok {
|
|
panic("nil i2.(I2) succeeded")
|
|
}
|
|
|
|
// Conversions can't fail, even with nil.
|
|
_ = I0(i0)
|
|
|
|
_ = I0(i1)
|
|
_ = I1(i1)
|
|
|
|
_ = I0(i2)
|
|
_ = I1(i2)
|
|
_ = I2(i2)
|
|
|
|
// Non-nil type assertions pass or fail based on the concrete type.
|
|
i1 = C1{}
|
|
if _, ok := i1.(I0); !ok {
|
|
panic("C1 i1.(I0) failed")
|
|
}
|
|
if _, ok := i1.(I1); !ok {
|
|
panic("C1 i1.(I1) failed")
|
|
}
|
|
if _, ok := i1.(I2); ok {
|
|
panic("C1 i1.(I2) succeeded")
|
|
}
|
|
|
|
i1 = C2{}
|
|
if _, ok := i1.(I0); !ok {
|
|
panic("C2 i1.(I0) failed")
|
|
}
|
|
if _, ok := i1.(I1); !ok {
|
|
panic("C2 i1.(I1) failed")
|
|
}
|
|
if _, ok := i1.(I2); !ok {
|
|
panic("C2 i1.(I2) failed")
|
|
}
|
|
|
|
// Conversions can't fail.
|
|
i1 = C1{}
|
|
if I0(i1) == nil {
|
|
panic("C1 I0(i1) was nil")
|
|
}
|
|
if I1(i1) == nil {
|
|
panic("C1 I1(i1) was nil")
|
|
}
|
|
}
|