]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.18] cmd/compile: fix transform of OEQ/ONE when one arg is a type...
authorKeith Randall <khr@golang.org>
Thu, 10 Mar 2022 17:02:34 +0000 (09:02 -0800)
committerDmitri Shuralyov <dmitshur@golang.org>
Mon, 14 Mar 2022 16:20:02 +0000 (16:20 +0000)
At this point in stenciling, we have shape types, not raw type parameters.
The code was correct in the other part of this function.

Update #51522

Change-Id: Ife495160a2be5f6af5400363c3efb68dda518b5f
Reviewed-on: https://go-review.googlesource.com/c/go/+/391475
Trust: Keith Randall <khr@golang.org>
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
(cherry picked from commit 8cf11694abbfbdbd4fe0b2c08511f81b8bfe5017)
Reviewed-on: https://go-review.googlesource.com/c/go/+/391794
Trust: Dmitri Shuralyov <dmitshur@golang.org>
Run-TryBot: Dmitri Shuralyov <dmitshur@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/noder/transform.go
test/typeparam/issue51522a.go [new file with mode: 0644]

index 5f1f41163b34c1c2537376ebca7bf9bef0d18f99..db28e8de3b05721f813c3e31fde355364bcc22dd 100644 (file)
@@ -242,7 +242,7 @@ func transformCompare(n *ir.BinaryExpr) {
                        aop, _ := typecheck.Assignop(rt, lt)
                        if aop != ir.OXXX {
                                types.CalcSize(rt)
-                               if rt.HasTParam() || rt.IsInterface() == lt.IsInterface() || rt.Size() >= 1<<16 {
+                               if rt.HasShape() || rt.IsInterface() == lt.IsInterface() || rt.Size() >= 1<<16 {
                                        r = ir.NewConvExpr(base.Pos, aop, lt, r)
                                        r.SetTypecheck(1)
                                }
diff --git a/test/typeparam/issue51522a.go b/test/typeparam/issue51522a.go
new file mode 100644 (file)
index 0000000..31ce4bf
--- /dev/null
@@ -0,0 +1,42 @@
+// run -gcflags=-G=3
+
+// 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 main
+
+
+func f[T comparable](i any) {
+       var t T
+
+       if i != t {
+               println("FAIL: if i != t")
+       }
+}
+
+type myint int
+
+func (m myint) foo() {
+}
+
+type fooer interface {
+       foo()
+}
+
+type comparableFoo interface {
+       comparable
+       foo()
+}
+
+func g[T comparableFoo](i fooer) {
+       var t T
+
+       if i != t {
+               println("FAIL: if i != t")
+       }
+}
+
+func main() {
+       f[int](int(0))
+       g[myint](myint(0))
+}