]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/gc: disallow fallthrough in final case of switch
authorTyler Bunnell <tylerbunnell@gmail.com>
Fri, 15 Mar 2013 04:35:09 +0000 (00:35 -0400)
committerRuss Cox <rsc@golang.org>
Fri, 15 Mar 2013 04:35:09 +0000 (00:35 -0400)
Small change to cmd/gc to catch a "fallthrough" in the final case of a switch.

R=golang-dev, rsc, mtj
CC=golang-dev
https://golang.org/cl/7841043

src/cmd/gc/swt.c
test/switch.go
test/switch4.go [new file with mode: 0644]

index a497b86222a9450c03afb1245d46adf7a798c1fe..5fba73140267973a7adf8f5973ff9ef38c5d7b84 100644 (file)
@@ -322,6 +322,10 @@ casebody(Node *sw, Node *typeswvar)
                                setlineno(last);
                                yyerror("cannot fallthrough in type switch");
                        }
+                       if(l->next == nil) {
+                               setlineno(last);
+                               yyerror("cannot fallthrough final case in switch");
+                       }
                        last->op = OFALL;
                } else
                        stat = list(stat, br);
index bcbde68e468bd039811c4828103a9911bb3a19be..5e1d85bb68758769cc9a8a4bb9cc7ab1d441688d 100644 (file)
@@ -392,15 +392,6 @@ func main() {
        }
        assert(count == 2, "fail")
 
-       // fallthrough in final case.
-       count = 0
-       switch i5 {
-       case 5:
-               count++
-               fallthrough
-       }
-       assert(count == 1, "fail")
-
        i := 0
        switch x := 5; {
        case i < x:
diff --git a/test/switch4.go b/test/switch4.go
new file mode 100644 (file)
index 0000000..f38efe6
--- /dev/null
@@ -0,0 +1,36 @@
+// errorcheck
+
+// Copyright 2011 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.
+
+// Verify that erroneous switch statements are detected by the compiler.
+// Does not compile.
+
+package main
+
+type I interface {
+       M()
+}
+
+func bad() {
+
+       i5 := 5
+       switch i5 {
+       case 5:
+               fallthrough // ERROR "cannot fallthrough final case in switch"
+       }
+}
+
+func good() {
+       var i interface{}
+       var s string
+
+       switch i {
+       case s:
+       }
+
+       switch s {
+       case i:
+       }
+}