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