mirror of https://github.com/golang/go.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 <iant@golang.org>
This commit is contained in:
parent
91c8e5f80b
commit
63a6f305ef
|
|
@ -139,6 +139,8 @@ func typecheckswitch(n *Node) {
|
||||||
}
|
}
|
||||||
case nilonly != "" && !isnil(ll.N):
|
case nilonly != "" && !isnil(ll.N):
|
||||||
Yyerror("invalid case %v in switch (can only compare %s %v to nil)", ll.N, nilonly, n.Left)
|
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
|
// type switch
|
||||||
|
|
|
||||||
|
|
@ -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\)"
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue