go/test/fixedbugs/issue14006.go
griesemer 68e390304e cmd/compile/internal/syntax: consider function nesting for error recovery
This re-enables functionality that inadvertently was disabled in the
(long) past.

Also, don't perform branch checks if we had errors in a function
to avoid spurious errors or (worst-case) crashes.

Slightly modified test/fixedbugs/issue14006.go to make sure the
test still reports invalid label errors (the surrounding function
must be syntactically correct).

Change-Id: Id5642930877d7cf3400649094ec75c753b5084b7
Reviewed-on: https://go-review.googlesource.com/69770
Run-TryBot: Robert Griesemer <gri@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
2017-10-11 00:29:58 +00:00

67 lines
1 KiB
Go

// 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:
}
}
func g() {
var z bool
switch {
case z:
labelname: // ERROR "label labelname defined and not used"
}
switch {
case z:
labelname: ; // ERROR "label labelname already defined at LINE-5"
case false:
}
}