aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2011-12-06 10:48:17 -0500
committerRuss Cox <rsc@golang.org>2011-12-06 10:48:17 -0500
commit46deaa297bcf76438ae17b070ef351d5b91d3d59 (patch)
treee38a1c832c6501c507a96e998c6e87d3716fd068
parente4e4cdb39a821eb850200967cb21ab36e8d3a1be (diff)
downloadgo-46deaa297bcf76438ae17b070ef351d5b91d3d59.tar.gz
go-46deaa297bcf76438ae17b070ef351d5b91d3d59.zip
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
-rw-r--r--src/cmd/gc/subr.c3
-rw-r--r--src/pkg/reflect/all_test.go4
-rw-r--r--test/interface/noeq.go39
3 files changed, 42 insertions, 4 deletions
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c
index 8bdfaf7b0c..5584f78e2f 100644
--- a/src/cmd/gc/subr.c
+++ b/src/cmd/gc/subr.c
@@ -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)
diff --git a/src/pkg/reflect/all_test.go b/src/pkg/reflect/all_test.go
index a9e5d1cade..e43260196f 100644
--- a/src/pkg/reflect/all_test.go
+++ b/src/pkg/reflect/all_test.go
@@ -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()")
}
diff --git a/test/interface/noeq.go b/test/interface/noeq.go
new file mode 100644
index 0000000000..be368218d7
--- /dev/null
+++ b/test/interface/noeq.go
@@ -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()
+}