mirror of
https://github.com/golang/go
synced 2024-11-02 11:50:30 +00:00
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:
parent
7cd6cae6a6
commit
0e13dbc1a9
2 changed files with 25 additions and 1 deletions
|
@ -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
|
||||||
|
|
18
test/fixedbugs/issue15898.go
Normal file
18
test/fixedbugs/issue15898.go
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue