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