cmd/compile: disallow multiple nil cases in a type switch

Fixes #15898.

Change-Id: I66e2ad21f283563c7142aa820f0354711d964768
Reviewed-on: https://go-review.googlesource.com/23573
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
Josh Bleecher Snyder 2016-05-30 16:42:38 -07:00
parent 7cd6cae6a6
commit 0e13dbc1a9
2 changed files with 25 additions and 1 deletions

View file

@ -104,7 +104,7 @@ func typecheckswitch(n *Node) {
n.Type = t n.Type = t
var def *Node var def, niltype *Node
for _, ncase := range n.List.Slice() { for _, ncase := range n.List.Slice() {
setlineno(n) setlineno(n)
if ncase.List.Len() == 0 { if ncase.List.Len() == 0 {
@ -150,6 +150,12 @@ func typecheckswitch(n *Node) {
var ptr int var ptr int
switch { switch {
case n1.Op == OLITERAL && n1.Type.IsKind(TNIL): case n1.Op == OLITERAL && n1.Type.IsKind(TNIL):
// case nil:
if niltype != nil {
Yyerror("multiple nil cases in type switch (first at %v)", niltype.Line())
} else {
niltype = ncase
}
case n1.Op != OTYPE && n1.Type != nil: // should this be ||? case n1.Op != OTYPE && n1.Type != nil: // should this be ||?
Yyerror("%v is not a type", Nconv(n1, FmtLong)) Yyerror("%v is not a type", Nconv(n1, FmtLong))
// reset to original type // reset to original type

View file

@ -0,0 +1,18 @@
// errorcheck
// Copyright 2016 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.
package p
func f(e interface{}) {
switch e.(type) {
case nil, nil: // ERROR "multiple nil cases in type switch"
}
switch e.(type) {
case nil:
case nil: // ERROR "multiple nil cases in type switch"
}
}