| 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) | |
| } |