blob: fc276ddbf08de7c7e07837618857a6d74865f4a2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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)
}
|