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:
Russ Cox 2011-12-06 10:48:17 -05:00
parent e4e4cdb39a
commit 46deaa297b
3 changed files with 42 additions and 4 deletions

View file

@ -499,8 +499,7 @@ algtype(Type *t)
{
int a;
if(issimple[t->etype] || isptr[t->etype] ||
t->etype == TCHAN || t->etype == TFUNC || t->etype == TMAP) {
if(issimple[t->etype] || isptr[t->etype] || t->etype == TCHAN) {
if(t->width == 1)
a = AMEM8;
else if(t->width == 2)

View file

@ -468,8 +468,8 @@ func TestInterfaceValue(t *testing.T) {
func TestFunctionValue(t *testing.T) {
var x interface{} = func() {}
v := ValueOf(x)
if v.Interface() != v.Interface() || v.Interface() != x {
t.Fatalf("TestFunction != itself")
if fmt.Sprint(v.Interface()) != fmt.Sprint(x) {
t.Fatalf("TestFunction returned wrong pointer")
}
assert(t, v.Type().String(), "func()")
}

39
test/interface/noeq.go Normal file
View 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()
}