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