1package main 2 3// Tests of field promotion logic. 4 5type A struct { 6 x int 7 y *int 8} 9 10type B struct { 11 p int 12 q *int 13} 14 15type C struct { 16 A 17 *B 18} 19 20type D struct { 21 a int 22 C 23} 24 25func assert(cond bool) { 26 if !cond { 27 panic("failed") 28 } 29} 30 31func f1(c C) { 32 assert(c.x == c.A.x) 33 assert(c.y == c.A.y) 34 assert(&c.x == &c.A.x) 35 assert(&c.y == &c.A.y) 36 37 assert(c.p == c.B.p) 38 assert(c.q == c.B.q) 39 assert(&c.p == &c.B.p) 40 assert(&c.q == &c.B.q) 41 42 c.x = 1 43 *c.y = 1 44 c.p = 1 45 *c.q = 1 46} 47 48func f2(c *C) { 49 assert(c.x == c.A.x) 50 assert(c.y == c.A.y) 51 assert(&c.x == &c.A.x) 52 assert(&c.y == &c.A.y) 53 54 assert(c.p == c.B.p) 55 assert(c.q == c.B.q) 56 assert(&c.p == &c.B.p) 57 assert(&c.q == &c.B.q) 58 59 c.x = 1 60 *c.y = 1 61 c.p = 1 62 *c.q = 1 63} 64 65func f3(d D) { 66 assert(d.x == d.C.A.x) 67 assert(d.y == d.C.A.y) 68 assert(&d.x == &d.C.A.x) 69 assert(&d.y == &d.C.A.y) 70 71 assert(d.p == d.C.B.p) 72 assert(d.q == d.C.B.q) 73 assert(&d.p == &d.C.B.p) 74 assert(&d.q == &d.C.B.q) 75 76 d.x = 1 77 *d.y = 1 78 d.p = 1 79 *d.q = 1 80} 81 82func f4(d *D) { 83 assert(d.x == d.C.A.x) 84 assert(d.y == d.C.A.y) 85 assert(&d.x == &d.C.A.x) 86 assert(&d.y == &d.C.A.y) 87 88 assert(d.p == d.C.B.p) 89 assert(d.q == d.C.B.q) 90 assert(&d.p == &d.C.B.p) 91 assert(&d.q == &d.C.B.q) 92 93 d.x = 1 94 *d.y = 1 95 d.p = 1 96 *d.q = 1 97} 98 99func main() { 100 y := 123 101 c := C{ 102 A{x: 42, y: &y}, 103 &B{p: 42, q: &y}, 104 } 105 106 assert(&c.x == &c.A.x) 107 108 f1(c) 109 f2(&c) 110 111 d := D{C: c} 112 f3(d) 113 f4(&d) 114} 115