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