.gitignore added
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.1.0 / go / ssa / interp / testdata / ifaceconv.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.1.0/go/ssa/interp/testdata/ifaceconv.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.1.0/go/ssa/interp/testdata/ifaceconv.go
new file mode 100644 (file)
index 0000000..96fc105
--- /dev/null
@@ -0,0 +1,83 @@
+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")
+       }
+}