]> Cypherpunks.ru repositories - gostls13.git/blob - test/sizeof.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / test / sizeof.go
1 // run
2
3 // Copyright 2011 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
6
7 package main
8
9 import "unsafe"
10
11 type T struct {
12         X int
13 }
14
15 var t T
16
17 func isUintptr(uintptr) {}
18
19 type T2 struct {
20         A int32
21         U2
22 }
23
24 type U2 struct {
25         B int32
26         C int32
27 }
28
29 var t2 T2
30 var p2 *T2
31
32 func main() {
33         // Test unsafe.Sizeof, unsafe.Alignof, and unsafe.Offsetof all return uintptr.
34         isUintptr(unsafe.Sizeof(t))
35         isUintptr(unsafe.Alignof(t))
36         isUintptr(unsafe.Offsetof(t.X))
37
38         // Test correctness of Offsetof with respect to embedded fields (issue 4909).
39         if unsafe.Offsetof(t2.C) != 8 {
40                 println(unsafe.Offsetof(t2.C), "!= 8")
41                 panic("unsafe.Offsetof(t2.C) != 8")
42         }
43         if unsafe.Offsetof(p2.C) != 8 {
44                 println(unsafe.Offsetof(p2.C), "!= 8")
45                 panic("unsafe.Offsetof(p2.C) != 8")
46         }
47         if unsafe.Offsetof(t2.U2.C) != 4 {
48                 println(unsafe.Offsetof(t2.U2.C), "!= 4")
49                 panic("unsafe.Offsetof(t2.U2.C) != 4")
50         }
51         if unsafe.Offsetof(p2.U2.C) != 4 {
52                 println(unsafe.Offsetof(p2.U2.C), "!= 4")
53                 panic("unsafe.Offsetof(p2.U2.C) != 4")
54         }
55         testDeep()
56         testNotEmbedded()
57 }
58
59 type (
60         S1 struct {
61                 A int64
62                 S2
63         }
64         S2 struct {
65                 B int64
66                 S3
67         }
68         S3 struct {
69                 C int64
70                 S4
71         }
72         S4 struct {
73                 D int64
74                 S5
75         }
76         S5 struct {
77                 E int64
78                 S6
79         }
80         S6 struct {
81                 F int64
82                 S7
83         }
84         S7 struct {
85                 G int64
86                 S8
87         }
88         S8 struct {
89                 H int64
90                 *S1
91         }
92 )
93
94 func testDeep() {
95         var s1 S1
96         switch {
97         case unsafe.Offsetof(s1.A) != 0:
98                 panic("unsafe.Offsetof(s1.A) != 0")
99         case unsafe.Offsetof(s1.B) != 8:
100                 panic("unsafe.Offsetof(s1.B) != 8")
101         case unsafe.Offsetof(s1.C) != 16:
102                 panic("unsafe.Offsetof(s1.C) != 16")
103         case unsafe.Offsetof(s1.D) != 24:
104                 panic("unsafe.Offsetof(s1.D) != 24")
105         case unsafe.Offsetof(s1.E) != 32:
106                 panic("unsafe.Offsetof(s1.E) != 32")
107         case unsafe.Offsetof(s1.F) != 40:
108                 panic("unsafe.Offsetof(s1.F) != 40")
109         case unsafe.Offsetof(s1.G) != 48:
110                 panic("unsafe.Offsetof(s1.G) != 48")
111         case unsafe.Offsetof(s1.H) != 56:
112                 panic("unsafe.Offsetof(s1.H) != 56")
113         case unsafe.Offsetof(s1.S1) != 64:
114                 panic("unsafe.Offsetof(s1.S1) != 64")
115         case unsafe.Offsetof(s1.S1.S2.S3.S4.S5.S6.S7.S8.S1.S2) != 8:
116                 panic("unsafe.Offsetof(s1.S1.S2.S3.S4.S5.S6.S7.S8.S1.S2) != 8")
117         }
118 }
119
120 func testNotEmbedded() {
121         type T2 struct {
122                 B int32
123                 C int32
124         }
125         type T1 struct {
126                 A int32
127                 T2
128         }
129         type T struct {
130                 Dummy int32
131                 F     T1
132                 P     *T1
133         }
134
135         var t T
136         var p *T
137         switch {
138         case unsafe.Offsetof(t.F.B) != 4:
139                 panic("unsafe.Offsetof(t.F.B) != 4")
140         case unsafe.Offsetof(t.F.C) != 8:
141                 panic("unsafe.Offsetof(t.F.C) != 8")
142
143         case unsafe.Offsetof(t.P.B) != 4:
144                 panic("unsafe.Offsetof(t.P.B) != 4")
145         case unsafe.Offsetof(t.P.C) != 8:
146                 panic("unsafe.Offsetof(t.P.C) != 8")
147
148         case unsafe.Offsetof(p.F.B) != 4:
149                 panic("unsafe.Offsetof(p.F.B) != 4")
150         case unsafe.Offsetof(p.F.C) != 8:
151                 panic("unsafe.Offsetof(p.F.C) != 8")
152
153         case unsafe.Offsetof(p.P.B) != 4:
154                 panic("unsafe.Offsetof(p.P.B) != 4")
155         case unsafe.Offsetof(p.P.C) != 8:
156                 panic("unsafe.Offsetof(p.P.C) != 8")
157         }
158 }