From: Russ Cox Date: Mon, 14 Dec 2015 18:42:13 +0000 (-0500) Subject: cmd/compile: diagnose invalid switch interface{} case earlier X-Git-Tag: go1.6beta1~52 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=63a6f305ef7e4f0cd0d99e9714b259c1930f5609;p=gostls13.git cmd/compile: diagnose invalid switch interface{} case earlier Fixes #11737. Change-Id: Id231b502ac5a44035dc3a02515b43bf665cb1e87 Reviewed-on: https://go-review.googlesource.com/17816 Reviewed-by: Ian Lance Taylor --- diff --git a/src/cmd/compile/internal/gc/swt.go b/src/cmd/compile/internal/gc/swt.go index 29e634cebd..f0433f3df7 100644 --- a/src/cmd/compile/internal/gc/swt.go +++ b/src/cmd/compile/internal/gc/swt.go @@ -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 index 0000000000..01ef096830 --- /dev/null +++ b/test/fixedbugs/issue11737.go @@ -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\)" + } +}