]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: diagnose invalid switch interface{} case earlier
authorRuss Cox <rsc@golang.org>
Mon, 14 Dec 2015 18:42:13 +0000 (13:42 -0500)
committerRuss Cox <rsc@golang.org>
Wed, 16 Dec 2015 20:58:00 +0000 (20:58 +0000)
Fixes #11737.

Change-Id: Id231b502ac5a44035dc3a02515b43bf665cb1e87
Reviewed-on: https://go-review.googlesource.com/17816
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/compile/internal/gc/swt.go
test/fixedbugs/issue11737.go [new file with mode: 0644]

index 29e634cebde7366b54bc8fe2942d3409522f6d3e..f0433f3df70554b5d51121358e32d0197d8506fd 100644 (file)
@@ -139,6 +139,8 @@ func typecheckswitch(n *Node) {
                                                }
                                        case nilonly != "" && !isnil(ll.N):
                                                Yyerror("invalid case %v in switch (can only compare %s %v to nil)", ll.N, nilonly, n.Left)
+                                       case Isinter(t) && !Isinter(ll.N.Type) && algtype1(ll.N.Type, nil) == ANOEQ:
+                                               Yyerror("invalid case %v in switch (incomparable type)", Nconv(ll.N, obj.FmtLong))
                                        }
 
                                // type switch
diff --git a/test/fixedbugs/issue11737.go b/test/fixedbugs/issue11737.go
new file mode 100644 (file)
index 0000000..01ef096
--- /dev/null
@@ -0,0 +1,17 @@
+// errorcheck
+
+// Copyright 2015 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.
+
+// Issue 11737 - invalid == not being caught until generated switch code was compiled
+
+package p
+
+func f()
+
+func s(x interface{}) {
+       switch x {
+       case f: // ERROR "invalid case f \(type func\(\)\) in switch \(incomparable type\)"
+       }
+}