Initial commit: Go 1.23 release state
This commit is contained in:
158
test/sizeof.go
Normal file
158
test/sizeof.go
Normal file
@@ -0,0 +1,158 @@
|
||||
// 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")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user