| // run | |
| // Copyright 2010 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 | |
| // Test that structures pack densely, according to the alignment of the largest field. | |
| package main | |
| import ( | |
| "fmt" | |
| "os" | |
| "strconv" | |
| ) | |
| type T1 struct { | |
| x uint8 | |
| } | |
| type T2 struct { | |
| x uint16 | |
| } | |
| type T4 struct { | |
| x uint32 | |
| } | |
| func main() { | |
| report := len(os.Args) > 1 | |
| status := 0 | |
| var b1 [10]T1 | |
| a0, _ := strconv.ParseUint(fmt.Sprintf("%p", &b1[0])[2:], 16, 64) | |
| a1, _ := strconv.ParseUint(fmt.Sprintf("%p", &b1[1])[2:], 16, 64) | |
| if a1 != a0+1 { | |
| fmt.Println("FAIL") | |
| if report { | |
| fmt.Println("alignment should be 1, is", a1-a0) | |
| } | |
| status = 1 | |
| } | |
| var b2 [10]T2 | |
| a0, _ = strconv.ParseUint(fmt.Sprintf("%p", &b2[0])[2:], 16, 64) | |
| a1, _ = strconv.ParseUint(fmt.Sprintf("%p", &b2[1])[2:], 16, 64) | |
| if a1 != a0+2 { | |
| if status == 0 { | |
| fmt.Println("FAIL") | |
| status = 1 | |
| } | |
| if report { | |
| fmt.Println("alignment should be 2, is", a1-a0) | |
| } | |
| } | |
| var b4 [10]T4 | |
| a0, _ = strconv.ParseUint(fmt.Sprintf("%p", &b4[0])[2:], 16, 64) | |
| a1, _ = strconv.ParseUint(fmt.Sprintf("%p", &b4[1])[2:], 16, 64) | |
| if a1 != a0+4 { | |
| if status == 0 { | |
| fmt.Println("FAIL") | |
| status = 1 | |
| } | |
| if report { | |
| fmt.Println("alignment should be 4, is", a1-a0) | |
| } | |
| } | |
| os.Exit(status) | |
| } |