Skip to content

Commit

Permalink
cmd/compile: fix transform of OEQ/ONE when one arg is a type param
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
randall77 committed Mar 10, 2022
1 parent 91daaab commit 8cf1169
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/cmd/compile/internal/noder/transform.go
Expand Up @@ -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)
}
Expand Down
42 changes: 42 additions & 0 deletions test/typeparam/issue51522a.go
@@ -0,0 +1,42 @@
// run

// 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))
}

0 comments on commit 8cf1169

Please sign in to comment.