1
0
mirror of https://github.com/golang/go synced 2024-11-22 16:25:07 -07:00

cmd/compile: fix buglet in walk convert phase relating to convF32/64

The helper function used by the compiler's walk phase to determine
whether a param can be passed in a single float register wasn't quite
correct (didn't allow for the possibility of struct with two fields,
first zero size and second float). Fix up the helper to take this
case into account.

Updates #40724.

Change-Id: I55b42a1b17ea86de1d696788f029ad3aae4a179c
Reviewed-on: https://go-review.googlesource.com/c/go/+/308689
Trust: Than McIntosh <thanm@google.com>
Run-TryBot: Than McIntosh <thanm@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
Than McIntosh 2021-04-08 15:30:03 -04:00
parent 793844207d
commit bb76193a7f
3 changed files with 45 additions and 1 deletions

View File

@ -312,7 +312,22 @@ func convFuncName(from, to *types.Type) (fnname string, needsaddr bool) {
case types.TARRAY:
return t.NumElem() == 1 && isFloatLike(t.Elem())
case types.TSTRUCT:
return t.NumFields() == 1 && isFloatLike(t.Field(0).Type)
// allow for the possibility that we have a series of
// leading fields that are zero size before a float field.
// in addition, if we find a float field, it needs to be
// the last item in the struct (a trailing zero length
// field would introduce padding).
fsl := t.FieldSlice()
for idx, f := range fsl {
if f.Type.Width == 0 {
continue
}
if isFloatLike(f.Type) && idx == len(fsl)-1 {
return true
}
return false
}
return false
}
return false
}

View File

@ -0,0 +1,27 @@
// 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
import "fmt"
type myStruct struct {
F0 [0]struct{}
F1 float32
}
type myStruct2 struct {
F0 [0]struct{}
F1 float32
F2 [0]struct{}
}
func main() {
x := myStruct{F1: -1.25}
fmt.Println(x)
x2 := myStruct2{F1: -7.97}
fmt.Println(x2)
}

View File

@ -0,0 +1,2 @@
{[] -1.25}
{[] -7.97 []}