| // 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") | 
 | 	} | 
 | } |