1// run
2
3// Copyright 2010 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// Test that structures pack densely, according to the alignment of the largest field.
8
9package main
10
11import (
12	"fmt"
13	"os"
14	"strconv"
15)
16
17type T1 struct {
18	x uint8
19}
20type T2 struct {
21	x uint16
22}
23type T4 struct {
24	x uint32
25}
26
27func main() {
28	report := len(os.Args) > 1
29	status := 0
30	var b1 [10]T1
31	a0, _ := strconv.ParseUint(fmt.Sprintf("%p", &b1[0])[2:], 16, 64)
32	a1, _ := strconv.ParseUint(fmt.Sprintf("%p", &b1[1])[2:], 16, 64)
33	if a1 != a0+1 {
34		fmt.Println("FAIL")
35		if report {
36			fmt.Println("alignment should be 1, is", a1-a0)
37		}
38		status = 1
39	}
40	var b2 [10]T2
41	a0, _ = strconv.ParseUint(fmt.Sprintf("%p", &b2[0])[2:], 16, 64)
42	a1, _ = strconv.ParseUint(fmt.Sprintf("%p", &b2[1])[2:], 16, 64)
43	if a1 != a0+2 {
44		if status == 0 {
45			fmt.Println("FAIL")
46			status = 1
47		}
48		if report {
49			fmt.Println("alignment should be 2, is", a1-a0)
50		}
51	}
52	var b4 [10]T4
53	a0, _ = strconv.ParseUint(fmt.Sprintf("%p", &b4[0])[2:], 16, 64)
54	a1, _ = strconv.ParseUint(fmt.Sprintf("%p", &b4[1])[2:], 16, 64)
55	if a1 != a0+4 {
56		if status == 0 {
57			fmt.Println("FAIL")
58			status = 1
59		}
60		if report {
61			fmt.Println("alignment should be 4, is", a1-a0)
62		}
63	}
64	os.Exit(status)
65}
66