]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix inline static init with derived types
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Thu, 24 Nov 2022 05:43:22 +0000 (12:43 +0700)
committerGopher Robot <gobot@golang.org>
Wed, 30 Nov 2022 23:25:43 +0000 (23:25 +0000)
CL 450136 added handling for simple calls in staticinit. If there's any
derived types conversion in the body of generic function called, that
conversion will require runtime dictionary, thus the optimization could
not happen.

Fixes #56923

Change-Id: I498cee9f8ab4397812ef79a6c2ab6c55e0ee4aef
Reviewed-on: https://go-review.googlesource.com/c/go/+/453315
TryBot-Result: Gopher Robot <gobot@golang.org>
Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Gabriel Morency (Amgc63spaming) <morencyvincent8@gmail.com>
src/cmd/compile/internal/staticinit/sched.go
test/fixedbugs/issue56923.go [new file with mode: 0644]

index 12bf932a7be25503d6faf3e154aead406ea70ffd..fde128ec86d4bcc1b3fadf355b4bb0234e3ac861 100644 (file)
@@ -333,6 +333,11 @@ func (s *Schedule) StaticAssign(l *ir.Name, loff int64, r ir.Node, typ *types.Ty
                        return val.Op() == ir.ONIL
                }
 
+               if base.Debug.Unified != 0 && val.Type().HasShape() {
+                       // See comment in cmd/compile/internal/walk/convert.go:walkConvInterface
+                       return false
+               }
+
                reflectdata.MarkTypeUsedInInterface(val.Type(), l.Linksym())
 
                var itab *ir.AddrExpr
diff --git a/test/fixedbugs/issue56923.go b/test/fixedbugs/issue56923.go
new file mode 100644 (file)
index 0000000..700a104
--- /dev/null
@@ -0,0 +1,28 @@
+// compile
+
+// Copyright 2022 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 p
+
+type Eq[T any] interface {
+       Eqv(a T, b T) bool
+}
+
+type EqFunc[T any] func(a, b T) bool
+
+func (r EqFunc[T]) Eqv(a, b T) bool {
+       return r(a, b)
+}
+
+func New[T any](f func(a, b T) bool) Eq[T] {
+       return EqFunc[T](f)
+
+}
+
+func Equal(a, b []byte) bool {
+       return string(a) == string(b)
+}
+
+var Bytes Eq[[]byte] = New(Equal)