]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: disallow multiple nil cases in a type switch
authorJosh Bleecher Snyder <josharian@gmail.com>
Mon, 30 May 2016 23:42:38 +0000 (16:42 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Tue, 31 May 2016 20:31:00 +0000 (20:31 +0000)
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>
src/cmd/compile/internal/gc/swt.go
test/fixedbugs/issue15898.go [new file with mode: 0644]

index aac92fd3114380722e6671a607da72accc7e50d5..4940c97a9054373be8c46c25b0125aa13767990c 100644 (file)
@@ -104,7 +104,7 @@ func typecheckswitch(n *Node) {
 
        n.Type = t
 
-       var def *Node
+       var def, niltype *Node
        for _, ncase := range n.List.Slice() {
                setlineno(n)
                if ncase.List.Len() == 0 {
@@ -150,6 +150,12 @@ func typecheckswitch(n *Node) {
                                        var ptr int
                                        switch {
                                        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 ||?
                                                Yyerror("%v is not a type", Nconv(n1, FmtLong))
                                                // reset to original type
diff --git a/test/fixedbugs/issue15898.go b/test/fixedbugs/issue15898.go
new file mode 100644 (file)
index 0000000..7b66ea2
--- /dev/null
@@ -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"
+       }
+}