mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00:00
cmd/compile: correct type identity comparison with "any"
The builtin "any" type should only be identical to an unnamed empty interface type, not a defined empty interface type. Fixes #50169. Change-Id: Ie5bb88868497cb795de1fd0276133ba9812edfe4 Reviewed-on: https://go-review.googlesource.com/c/go/+/372217 Trust: Cherry Mui <cherryyz@google.com> Trust: Dan Scales <danscales@google.com> Reviewed-by: Dan Scales <danscales@google.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Cherry Mui <cherryyz@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
83fc0978e5
commit
bc0aba9717
@ -59,12 +59,13 @@ func identical(t1, t2 *Type, flags int, assumedEqual map[typePair]struct{}) bool
|
|||||||
case TINT32:
|
case TINT32:
|
||||||
return (t1 == Types[TINT32] || t1 == RuneType) && (t2 == Types[TINT32] || t2 == RuneType)
|
return (t1 == Types[TINT32] || t1 == RuneType) && (t2 == Types[TINT32] || t2 == RuneType)
|
||||||
case TINTER:
|
case TINTER:
|
||||||
// Make sure named any type matches any empty interface
|
// Make sure named any type matches any unnamed empty interface
|
||||||
// (but not a shape type, if identStrict).
|
// (but not a shape type, if identStrict).
|
||||||
|
isUnnamedEface := func(t *Type) bool { return t.IsEmptyInterface() && t.Sym() == nil }
|
||||||
if flags&identStrict != 0 {
|
if flags&identStrict != 0 {
|
||||||
return t1 == AnyType && t2.IsEmptyInterface() && !t2.HasShape() || t2 == AnyType && t1.IsEmptyInterface() && !t1.HasShape()
|
return t1 == AnyType && isUnnamedEface(t2) && !t2.HasShape() || t2 == AnyType && isUnnamedEface(t1) && !t1.HasShape()
|
||||||
}
|
}
|
||||||
return t1 == AnyType && t2.IsEmptyInterface() || t2 == AnyType && t1.IsEmptyInterface()
|
return t1 == AnyType && isUnnamedEface(t2) || t2 == AnyType && isUnnamedEface(t1)
|
||||||
default:
|
default:
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
24
test/fixedbugs/issue50169.go
Normal file
24
test/fixedbugs/issue50169.go
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// compile
|
||||||
|
|
||||||
|
// 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
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var x Value
|
||||||
|
NewScanner().Scan(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Value any
|
||||||
|
|
||||||
|
type Scanner interface{ Scan(any) error }
|
||||||
|
|
||||||
|
func NewScanner() Scanner {
|
||||||
|
return &t{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type t struct{}
|
||||||
|
|
||||||
|
func (*t) Scan(interface{}) error { return nil }
|
Loading…
x
Reference in New Issue
Block a user