mirror of
https://github.com/golang/go
synced 2024-11-13 18:50:24 -07:00
912a638b0c
Instead of a separate check control flow pass (checkcfg.go) operating on nodes, perform this check at parse time on the new syntax tree. Permits this check to be done concurrently, and doesn't depend on the specifics of the symbol's dclstack implementation anymore. The remaining dclstack uses will be removed in a follow-up change. - added CheckBranches Mode flag (so we can turn off the check if we only care about syntactic correctness, e.g. for tests) - adjusted test/goto.go error messages: the new branches checker only reports if a goto jumps into a block, but not which block (we may want to improve this again, eventually) - also, the new branches checker reports one variable that is being jumped over by a goto, but it may not be the first one declared (this is fine either way) - the new branches checker reports additional errors for fixedbugs/issue14006.go (not crucial to avoid those errors) - the new branches checker now correctly reports only variable declarations being jumped over, rather than all declarations (issue 8042). Added respective tests. Fixes #8042. Change-Id: I53b6e1bda189748e1e1fb5b765a8a64337c27d40 Reviewed-on: https://go-review.googlesource.com/39998 Reviewed-by: Matthew Dempsky <mdempsky@google.com>
67 lines
688 B
Go
67 lines
688 B
Go
// compile
|
|
|
|
// Copyright 2017 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 gotos across non-variable declarations
|
|
// are accepted.
|
|
|
|
package p
|
|
|
|
func _() {
|
|
goto L1
|
|
const x = 0
|
|
L1:
|
|
goto L2
|
|
type T int
|
|
L2:
|
|
}
|
|
|
|
func _() {
|
|
{
|
|
goto L1
|
|
}
|
|
const x = 0
|
|
L1:
|
|
{
|
|
goto L2
|
|
}
|
|
type T int
|
|
L2:
|
|
}
|
|
|
|
func _(d int) {
|
|
if d > 0 {
|
|
goto L1
|
|
} else {
|
|
goto L2
|
|
}
|
|
const x = 0
|
|
L1:
|
|
switch d {
|
|
case 1:
|
|
goto L3
|
|
case 2:
|
|
default:
|
|
goto L4
|
|
}
|
|
type T1 int
|
|
L2:
|
|
const y = 1
|
|
L3:
|
|
for d > 0 {
|
|
if d < 10 {
|
|
goto L4
|
|
}
|
|
}
|
|
type T2 int
|
|
L4:
|
|
select {
|
|
default:
|
|
goto L5
|
|
}
|
|
type T3 int
|
|
L5:
|
|
}
|