]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't crash on invalid labeled statement
authorRobert Griesemer <gri@golang.org>
Tue, 19 Jan 2016 21:14:03 +0000 (13:14 -0800)
committerRobert Griesemer <gri@golang.org>
Tue, 19 Jan 2016 21:34:28 +0000 (21:34 +0000)
Fixes #14006.

Change-Id: Ia819073677ad6993c02255e23760ee21598427b4
Reviewed-on: https://go-review.googlesource.com/18736
Run-TryBot: Robert Griesemer <gri@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/parser.go
test/fixedbugs/issue14006.go [new file with mode: 0644]

index 3279f4c6b074713d821efad025dce10a2f9e974e..282e855b37eacf4ba16c0c7a1d8917f0c19ef947 100644 (file)
@@ -668,9 +668,14 @@ func (p *parser) simple_stmt(labelOk, rangeOk bool) *Node {
                        if labelOk {
                                // If we have a labelname, it was parsed by operand
                                // (calling p.name()) and given an ONAME, ONONAME, OTYPE, OPACK, or OLITERAL node.
+                               // We only have a labelname if there is a symbol (was issue 14006).
                                switch lhs.Op {
                                case ONAME, ONONAME, OTYPE, OPACK, OLITERAL:
-                                       lhs = newname(lhs.Sym)
+                                       if lhs.Sym != nil {
+                                               lhs = newname(lhs.Sym)
+                                               break
+                                       }
+                                       fallthrough
                                default:
                                        p.syntax_error("expecting semicolon or newline or }")
                                        // we already progressed, no need to advance
diff --git a/test/fixedbugs/issue14006.go b/test/fixedbugs/issue14006.go
new file mode 100644 (file)
index 0000000..b56ed73
--- /dev/null
@@ -0,0 +1,64 @@
+// 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.
+
+// Literals that happen to resolve to named constants
+// may be used as label names (see issue 13684). Make
+// sure that other literals don't crash the compiler.
+
+package main
+
+const labelname = 1
+
+func main() {
+       goto labelname
+labelname:
+}
+
+func f() {
+       var x int
+       switch x {
+       case 1:
+               2:      // ERROR "unexpected :"
+       case 2:
+       }
+
+       switch x {
+       case 1:
+               2: ;    // ERROR "unexpected :"
+       case 2:
+       }
+
+       var y string
+       switch y {
+       case "foo":
+               "bar":  // ERROR "unexpected :"
+       case "bar":
+       }
+
+       switch y {
+       case "foo":
+               "bar": ;        // ERROR "unexpected :"
+       case "bar":
+       }
+
+       var z bool
+       switch {
+       case z:
+               labelname:      // ERROR "missing statement after label"
+       case false:
+       }
+
+       switch {
+       case z:
+               labelname:
+       }
+
+       switch {
+       case z:
+               labelname: ;
+       case false:
+       }
+}
\ No newline at end of file