Includes test.
Long term, need to make the offending code be more in terms
of official types package offsets, instead of duplicating that
logic.
For #40724.
Change-Id: Id33a153f10aed3289cc48d1f99a8e0f6ece9474d
Reviewed-on: https://go-review.googlesource.com/c/go/+/306469
Trust: David Chase <drchase@google.com>
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
offsets, at = appendParamOffsets(offsets, at, t.Elem())
}
case types.TSTRUCT:
- for _, f := range t.FieldSlice() {
+ for i, f := range t.FieldSlice() {
offsets, at = appendParamOffsets(offsets, at, f.Type)
+ if f.Type.Width == 0 && i == t.NumFields()-1 {
+ at++ // last field has zero width
+ }
}
at = align(at, t) // type size is rounded up to its alignment
case types.TSLICE:
--- /dev/null
+// run
+
+// Copyright 2021 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
+
+var p0exp = S1{
+ F1: complex(float64(2.3640607624715027), float64(-0.2717825524109192)),
+ F2: S2{F1: 9},
+ F3: 103050709,
+}
+
+type S1 struct {
+ F1 complex128
+ F2 S2
+ F3 uint64
+}
+
+type S2 struct {
+ F1 uint64
+ F2 empty
+}
+
+type empty struct {
+}
+
+//go:noinline
+//go:registerparams
+func callee(p0 S1) {
+ if p0 != p0exp {
+ panic("bad p0")
+ }
+}
+
+func main() {
+ callee(p0exp)
+}