mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
gc: disallow map/func equality via interface comparison
Missed when I removed direct map/func equality. R=ken2 CC=golang-dev https://golang.org/cl/5452052
This commit is contained in:
parent
e4e4cdb39a
commit
46deaa297b
3 changed files with 42 additions and 4 deletions
|
|
@ -499,8 +499,7 @@ algtype(Type *t)
|
||||||
{
|
{
|
||||||
int a;
|
int a;
|
||||||
|
|
||||||
if(issimple[t->etype] || isptr[t->etype] ||
|
if(issimple[t->etype] || isptr[t->etype] || t->etype == TCHAN) {
|
||||||
t->etype == TCHAN || t->etype == TFUNC || t->etype == TMAP) {
|
|
||||||
if(t->width == 1)
|
if(t->width == 1)
|
||||||
a = AMEM8;
|
a = AMEM8;
|
||||||
else if(t->width == 2)
|
else if(t->width == 2)
|
||||||
|
|
|
||||||
|
|
@ -468,8 +468,8 @@ func TestInterfaceValue(t *testing.T) {
|
||||||
func TestFunctionValue(t *testing.T) {
|
func TestFunctionValue(t *testing.T) {
|
||||||
var x interface{} = func() {}
|
var x interface{} = func() {}
|
||||||
v := ValueOf(x)
|
v := ValueOf(x)
|
||||||
if v.Interface() != v.Interface() || v.Interface() != x {
|
if fmt.Sprint(v.Interface()) != fmt.Sprint(x) {
|
||||||
t.Fatalf("TestFunction != itself")
|
t.Fatalf("TestFunction returned wrong pointer")
|
||||||
}
|
}
|
||||||
assert(t, v.Type().String(), "func()")
|
assert(t, v.Type().String(), "func()")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
39
test/interface/noeq.go
Normal file
39
test/interface/noeq.go
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: interface/noeq
|
||||||
|
|
||||||
|
// Copyright 2011 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.
|
||||||
|
|
||||||
|
// Interface values containing types that cannot be compared for equality.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
cmp(1)
|
||||||
|
|
||||||
|
var (
|
||||||
|
m map[int]int
|
||||||
|
s struct{}
|
||||||
|
f func()
|
||||||
|
)
|
||||||
|
noCmp(m)
|
||||||
|
noCmp(s)
|
||||||
|
noCmp(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func cmp(x interface{}) bool {
|
||||||
|
return x == x
|
||||||
|
}
|
||||||
|
|
||||||
|
func noCmp(x interface{}) {
|
||||||
|
shouldPanic(func() { cmp(x) })
|
||||||
|
}
|
||||||
|
|
||||||
|
func shouldPanic(f func()) {
|
||||||
|
defer func() {
|
||||||
|
if recover() == nil {
|
||||||
|
panic("function should panic")
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
f()
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue