From 4c7449efe5f220eaa4ec0b76af83a0bc8ec0eac2 Mon Sep 17 00:00:00 2001 From: Steven Kabbes Date: Tue, 17 May 2022 21:23:43 -0700 Subject: compiler: alignof [0]func() = 1 In the go protobuf code, a pattern is used to statically prevent comparable structs by embedding: ``` type DoNotCompare [0]func() type message struct { DoNotCompare data *uint32 } ``` Previously, sizezof(message{}) is 2 words large, but it only needs to be 1 byte. Making it be 1 byte allows protobufs to compile slightly more (though not all the way). --- testdata/reflect.go | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'testdata') diff --git a/testdata/reflect.go b/testdata/reflect.go index 7cc5fa7bb..f48683150 100644 --- a/testdata/reflect.go +++ b/testdata/reflect.go @@ -52,6 +52,12 @@ func main() { println("\nvalues of interfaces") var zeroSlice []byte var zeroFunc func() + // by embedding a 0-array func type in your struct, it is not comparable + type doNotCompare [0]func() + type notComparable struct { + doNotCompare + data *int32 + } var zeroMap map[string]int var zeroChan chan int n := 42 @@ -170,6 +176,10 @@ func main() { assertSize(reflect.TypeOf(new(int)).Size() == unsafe.Sizeof(new(int)), "*int") assertSize(reflect.TypeOf(zeroFunc).Size() == unsafe.Sizeof(zeroFunc), "func()") + // make sure embedding a zero-sized "not comparable" struct does not add size to a struct + assertSize(reflect.TypeOf(doNotCompare{}).Size() == unsafe.Sizeof(doNotCompare{}), "[0]func()") + assertSize(unsafe.Sizeof(notComparable{}) == unsafe.Sizeof((*int32)(nil)), "struct{[0]func(); *int32}") + // Test that offset is correctly calculated. // This doesn't just test reflect but also (indirectly) that unsafe.Alignof // works correctly. -- cgit v1.2.3