// run
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import "unsafe"
type T struct {
X int
}
var t T
func isUintptr(uintptr) {}
type T2 struct {
A int32
U2
}
type U2 struct {
B int32
C int32
}
var t2 T2
var p2 *T2
func main() {
// Test unsafe.Sizeof, unsafe.Alignof, and unsafe.Offsetof all return uintptr.
isUintptr(unsafe.Sizeof(t))
isUintptr(unsafe.Alignof(t))
isUintptr(unsafe.Offsetof(t.X))
// Test correctness of Offsetof with respect to embedded fields (issue 4909).
if unsafe.Offsetof(t2.C) != 8 {
println(unsafe.Offsetof(t2.C), "!= 8")
panic("unsafe.Offsetof(t2.C) != 8")
}
if unsafe.Offsetof(p2.C) != 8 {
println(unsafe.Offsetof(p2.C), "!= 8")
panic("unsafe.Offsetof(p2.C) != 8")
}
if unsafe.Offsetof(t2.U2.C) != 4 {
println(unsafe.Offsetof(t2.U2.C), "!= 4")
panic("unsafe.Offsetof(t2.U2.C) != 4")
}
if unsafe.Offsetof(p2.U2.C) != 4 {
println(unsafe.Offsetof(p2.U2.C), "!= 4")
panic("unsafe.Offsetof(p2.U2.C) != 4")
}
testDeep()
testNotEmbedded()
}
type (
S1 struct {
A int64
S2
}
S2 struct {
B int64
S3
}
S3 struct {
C int64
S4
}
S4 struct {
D int64
S5
}
S5 struct {
E int64
S6
}
S6 struct {
F int64
S7
}
S7 struct {
G int64
S8
}
S8 struct {
H int64
*S1
}
)
func testDeep() {
var s1 S1
switch {
case unsafe.Offsetof(s1.A) != 0:
panic("unsafe.Offsetof(s1.A) != 0")
case unsafe.Offsetof(s1.B) != 8:
panic("unsafe.Offsetof(s1.B) != 8")
case unsafe.Offsetof(s1.C) != 16:
panic("unsafe.Offsetof(s1.C) != 16")
case unsafe.Offsetof(s1.D) != 24:
panic("unsafe.Offsetof(s1.D) != 24")
case unsafe.Offsetof(s1.E) != 32:
panic("unsafe.Offsetof(s1.E) != 32")
case unsafe.Offsetof(s1.F) != 40:
panic("unsafe.Offsetof(s1.F) != 40")
case unsafe.Offsetof(s1.G) != 48:
panic("unsafe.Offsetof(s1.G) != 48")
case unsafe.Offsetof(s1.H) != 56:
panic("unsafe.Offsetof(s1.H) != 56")
case unsafe.Offsetof(s1.S1) != 64:
panic("unsafe.Offsetof(s1.S1) != 64")
case unsafe.Offsetof(s1.S1.S2.S3.S4.S5.S6.S7.S8.S1.S2) != 8:
panic("unsafe.Offsetof(s1.S1.S2.S3.S4.S5.S6.S7.S8.S1.S2) != 8")
}
}
func testNotEmbedded() {
type T2 struct {
B int32
C int32
}
type T1 struct {
A int32
T2
}
type T struct {
Dummy int32
F T1
P *T1
}
var t T
var p *T
switch {
case unsafe.Offsetof(t.F.B) != 4:
panic("unsafe.Offsetof(t.F.B) != 4")
case unsafe.Offsetof(t.F.C) != 8:
panic("unsafe.Offsetof(t.F.C) != 8")
case unsafe.Offsetof(t.P.B) != 4:
panic("unsafe.Offsetof(t.P.B) != 4")
case unsafe.Offsetof(t.P.C) != 8:
panic("unsafe.Offsetof(t.P.C) != 8")
case unsafe.Offsetof(p.F.B) != 4:
panic("unsafe.Offsetof(p.F.B) != 4")
case unsafe.Offsetof(p.F.C) != 8:
panic("unsafe.Offsetof(p.F.C) != 8")
case unsafe.Offsetof(p.P.B) != 4:
panic("unsafe.Offsetof(p.P.B) != 4")
case unsafe.Offsetof(p.P.C) != 8:
panic("unsafe.Offsetof(p.P.C) != 8")
}
}