Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201028153306-37f0764111ff / go / ssa / interp / testdata / fieldprom.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/go/ssa/interp/testdata/fieldprom.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/go/ssa/interp/testdata/fieldprom.go
new file mode 100644 (file)
index 0000000..fc276dd
--- /dev/null
@@ -0,0 +1,114 @@
+package main
+
+// Tests of field promotion logic.
+
+type A struct {
+       x int
+       y *int
+}
+
+type B struct {
+       p int
+       q *int
+}
+
+type C struct {
+       A
+       *B
+}
+
+type D struct {
+       a int
+       C
+}
+
+func assert(cond bool) {
+       if !cond {
+               panic("failed")
+       }
+}
+
+func f1(c C) {
+       assert(c.x == c.A.x)
+       assert(c.y == c.A.y)
+       assert(&c.x == &c.A.x)
+       assert(&c.y == &c.A.y)
+
+       assert(c.p == c.B.p)
+       assert(c.q == c.B.q)
+       assert(&c.p == &c.B.p)
+       assert(&c.q == &c.B.q)
+
+       c.x = 1
+       *c.y = 1
+       c.p = 1
+       *c.q = 1
+}
+
+func f2(c *C) {
+       assert(c.x == c.A.x)
+       assert(c.y == c.A.y)
+       assert(&c.x == &c.A.x)
+       assert(&c.y == &c.A.y)
+
+       assert(c.p == c.B.p)
+       assert(c.q == c.B.q)
+       assert(&c.p == &c.B.p)
+       assert(&c.q == &c.B.q)
+
+       c.x = 1
+       *c.y = 1
+       c.p = 1
+       *c.q = 1
+}
+
+func f3(d D) {
+       assert(d.x == d.C.A.x)
+       assert(d.y == d.C.A.y)
+       assert(&d.x == &d.C.A.x)
+       assert(&d.y == &d.C.A.y)
+
+       assert(d.p == d.C.B.p)
+       assert(d.q == d.C.B.q)
+       assert(&d.p == &d.C.B.p)
+       assert(&d.q == &d.C.B.q)
+
+       d.x = 1
+       *d.y = 1
+       d.p = 1
+       *d.q = 1
+}
+
+func f4(d *D) {
+       assert(d.x == d.C.A.x)
+       assert(d.y == d.C.A.y)
+       assert(&d.x == &d.C.A.x)
+       assert(&d.y == &d.C.A.y)
+
+       assert(d.p == d.C.B.p)
+       assert(d.q == d.C.B.q)
+       assert(&d.p == &d.C.B.p)
+       assert(&d.q == &d.C.B.q)
+
+       d.x = 1
+       *d.y = 1
+       d.p = 1
+       *d.q = 1
+}
+
+func main() {
+       y := 123
+       c := C{
+               A{x: 42, y: &y},
+               &B{p: 42, q: &y},
+       }
+
+       assert(&c.x == &c.A.x)
+
+       f1(c)
+       f2(&c)
+
+       d := D{C: c}
+       f3(d)
+       f4(&d)
+}