Skip to content

Commit

Permalink
cmd/internal/gc: ignore declarations of types for goto validation
Browse files Browse the repository at this point in the history
Fixes golang#8042.

Change-Id: I75080f24104256065fd73b07a13c5b8e7d6da94c
Reviewed-on: https://go-review.googlesource.com/9442
Reviewed-by: Russ Cox <[email protected]>
  • Loading branch information
DanielMorsing committed May 15, 2015
1 parent 76ec0ee commit 5726af5
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 3 deletions.
3 changes: 3 additions & 0 deletions src/cmd/internal/gc/dcl.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ func popdcl() {
}
s = Pkglookup(d.Name, d.Pkg)
lno = int(s.Lastlineno)
if s.Def != nil {
d.whyPushed = s.Def.Op
}
dcopy(s, d)
d.Lastlineno = int32(lno)
if dflag() {
Expand Down
21 changes: 18 additions & 3 deletions src/cmd/internal/gc/gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,21 @@ func checkgoto(from *Node, to *Node) {
fs = fs.Link
}
if fs != to.Sym {
// more declarations at label than at goto.
// figure out if they are all types.
ts := to.Sym
ntt := nt
for ; ntt > nf; ntt-- {
if ts.whyPushed != OTYPE {
break
}
ts = ts.Link
}
// all types, nothing to see here.
if ntt == nf {
return
}

lno := int(lineno)
setlineno(from)

Expand All @@ -168,11 +183,11 @@ func checkgoto(from *Node, to *Node) {
var block *Sym

var dcl *Sym
ts := to.Sym
ts = to.Sym
for ; nt > nf; nt-- {
if ts.Pkg == nil {
block = ts
} else {
} else if ts.whyPushed != OTYPE {
dcl = ts
}
ts = ts.Link
Expand All @@ -181,7 +196,7 @@ func checkgoto(from *Node, to *Node) {
for ts != fs {
if ts.Pkg == nil {
block = ts
} else {
} else if ts.whyPushed != OTYPE {
dcl = ts
}
ts = ts.Link
Expand Down
1 change: 1 addition & 0 deletions src/cmd/internal/gc/go.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ type Sym struct {
Uniqgen uint32
Importdef *Pkg // where imported definition was found
Linkname string // link name
whyPushed uint8 // why this symbol pushed onto dclstack. Same as Node.Op. Used by goto validation

// saved and restored by dcopy
Pkg *Pkg
Expand Down
16 changes: 16 additions & 0 deletions test/goto.go
Original file line number Diff line number Diff line change
Expand Up @@ -536,3 +536,19 @@ func _() {
goto L // ERROR "goto L jumps into block starting at LINE-4|goto jumps into block"
}
}

// issue 8042
func _() {
goto L
type a int
L:
}

// make sure we only complain about variable declarations.
func _() {
goto L // ERROR "goto L jumps over declaration of x at LINE+2|goto jumps over declaration"
type a int
x := 1 // GCCGO_ERROR "defined here"
_ = x
L:
}

0 comments on commit 5726af5

Please sign in to comment.