mirror of
https://github.com/golang/go
synced 2024-11-11 22:00:23 -07:00
cmd/compile: don't crash on invalid labeled statement
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>
This commit is contained in:
parent
92ba69d216
commit
7ce2402bae
@ -668,9 +668,14 @@ func (p *parser) simple_stmt(labelOk, rangeOk bool) *Node {
|
|||||||
if labelOk {
|
if labelOk {
|
||||||
// If we have a labelname, it was parsed by operand
|
// If we have a labelname, it was parsed by operand
|
||||||
// (calling p.name()) and given an ONAME, ONONAME, OTYPE, OPACK, or OLITERAL node.
|
// (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 {
|
switch lhs.Op {
|
||||||
case ONAME, ONONAME, OTYPE, OPACK, OLITERAL:
|
case ONAME, ONONAME, OTYPE, OPACK, OLITERAL:
|
||||||
lhs = newname(lhs.Sym)
|
if lhs.Sym != nil {
|
||||||
|
lhs = newname(lhs.Sym)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
fallthrough
|
||||||
default:
|
default:
|
||||||
p.syntax_error("expecting semicolon or newline or }")
|
p.syntax_error("expecting semicolon or newline or }")
|
||||||
// we already progressed, no need to advance
|
// we already progressed, no need to advance
|
||||||
|
64
test/fixedbugs/issue14006.go
Normal file
64
test/fixedbugs/issue14006.go
Normal file
@ -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:
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user