]> Cypherpunks.ru repositories - gostls13.git/blobdiff - test/sizeof.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / test / sizeof.go
index 292f73ae4d1d0e87dde40913bf4d15895b2edffd..3e2689fda70f05eb709cffb0e15ede88ca347c5c 100644 (file)
@@ -1,6 +1,6 @@
-// compile
+// run
 
-// Copyright 2011 The Go Authors.  All rights reserved.
+// 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.
 
@@ -16,8 +16,143 @@ 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")
+       }
 }