From 63a6f305ef7e4f0cd0d99e9714b259c1930f5609 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 14 Dec 2015 13:42:13 -0500 Subject: [PATCH] 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 --- src/cmd/compile/internal/gc/swt.go | 2 ++ test/fixedbugs/issue11737.go | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 test/fixedbugs/issue11737.go 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\)" + } +} -- 2.50.0