From: Dan Scales Date: Tue, 6 Apr 2021 03:03:02 +0000 (-0700) Subject: cmd/compile: fix gcSizes.Sizeof for a zero-sized struct X-Git-Tag: go1.17beta1~825 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=5cd8a344954cc29be9bce6d67b3f4293ed72aa9f;p=gostls13.git cmd/compile: fix gcSizes.Sizeof for a zero-sized struct (*gcSizes).Sizeof was requiring the last field of a zero-sized struct to be at least one byte. But that rule (fix for #9401, see logic in calcStructOffset) only applies to a struct that has some non-zero sized fields. Fix (*gcSizes).Sizeof to have the logic like calcStructOffset. Fixes running the gotests with -G=3 enabled. Fixes #45390 Change-Id: I011f40e3de3a327392bbbb791b9422be75336313 Reviewed-on: https://go-review.googlesource.com/c/go/+/307549 Reviewed-by: Robert Griesemer Trust: Dan Scales --- diff --git a/src/cmd/compile/internal/noder/sizes.go b/src/cmd/compile/internal/noder/sizes.go index 7cda6da9a6..23f2062675 100644 --- a/src/cmd/compile/internal/noder/sizes.go +++ b/src/cmd/compile/internal/noder/sizes.go @@ -115,10 +115,10 @@ func (s *gcSizes) Sizeof(T types2.Type) int64 { } offsets := s.Offsetsof(fields) - // gc: The last field of a struct is not allowed to + // gc: The last field of a non-zero-sized struct is not allowed to // have size 0. last := s.Sizeof(fields[n-1].Type()) - if last == 0 { + if last == 0 && offsets[n-1] > 0 { last = 1 }