mirror of
https://github.com/golang/go
synced 2024-11-19 05:34:40 -07:00
115 lines
1.4 KiB
Go
115 lines
1.4 KiB
Go
|
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)
|
||
|
}
|