Skip to content

Commit

Permalink
cmd/compile: don't crash on invalid labeled statement
Browse files Browse the repository at this point in the history
Fixes golang#14006.

Change-Id: Ia819073677ad6993c02255e23760ee21598427b4
Reviewed-on: https://go-review.googlesource.com/18736
Run-TryBot: Robert Griesemer <[email protected]>
Reviewed-by: Russ Cox <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
  • Loading branch information
griesemer committed Jan 19, 2016
1 parent 92ba69d commit 7ce2402
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/cmd/compile/internal/gc/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
64 changes: 64 additions & 0 deletions test/fixedbugs/issue14006.go
Original file line number Diff line number Diff line change
@@ -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:
}
}

0 comments on commit 7ce2402

Please sign in to comment.