mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00:00
cmd/compile: fix inlining labeled switch statements
CL 357649 fixes inlining labeled FOR/RANGE loops, we should do same translation for inlined SWITCH's label Fixes #49145 Change-Id: I9a6f365f57e974271a1eb279b38e81f9b5148788 Reviewed-on: https://go-review.googlesource.com/c/go/+/358315 Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com> Trust: Dan Scales <danscales@google.com> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Dan Scales <danscales@google.com>
This commit is contained in:
parent
2c66cab8a7
commit
c6e82e5808
@ -1285,18 +1285,24 @@ func (subst *inlsubst) node(n ir.Node) ir.Node {
|
|||||||
ir.EditChildren(m, subst.edit)
|
ir.EditChildren(m, subst.edit)
|
||||||
|
|
||||||
if subst.newclofn == nil {
|
if subst.newclofn == nil {
|
||||||
// Translate any label on FOR or RANGE loops
|
// Translate any label on FOR, RANGE loops or SWITCH
|
||||||
if m.Op() == ir.OFOR {
|
switch m.Op() {
|
||||||
|
case ir.OFOR:
|
||||||
m := m.(*ir.ForStmt)
|
m := m.(*ir.ForStmt)
|
||||||
m.Label = translateLabel(m.Label)
|
m.Label = translateLabel(m.Label)
|
||||||
return m
|
return m
|
||||||
|
|
||||||
|
case ir.ORANGE:
|
||||||
|
m := m.(*ir.RangeStmt)
|
||||||
|
m.Label = translateLabel(m.Label)
|
||||||
|
return m
|
||||||
|
|
||||||
|
case ir.OSWITCH:
|
||||||
|
m := m.(*ir.SwitchStmt)
|
||||||
|
m.Label = translateLabel(m.Label)
|
||||||
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
if m.Op() == ir.ORANGE {
|
|
||||||
m := m.(*ir.RangeStmt)
|
|
||||||
m.Label = translateLabel(m.Label)
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch m := m.(type) {
|
switch m := m.(type) {
|
||||||
|
27
test/fixedbugs/issue49145.go
Normal file
27
test/fixedbugs/issue49145.go
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// run
|
||||||
|
|
||||||
|
// Copyright 2021 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.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
func f(j int) {
|
||||||
|
loop:
|
||||||
|
switch j {
|
||||||
|
case 1:
|
||||||
|
break loop
|
||||||
|
default:
|
||||||
|
println(j)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
loop:
|
||||||
|
for j := 0; j < 5; j++ {
|
||||||
|
f(j)
|
||||||
|
if j == 3 {
|
||||||
|
break loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
test/fixedbugs/issue49145.out
Normal file
3
test/fixedbugs/issue49145.out
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
0
|
||||||
|
2
|
||||||
|
3
|
Loading…
x
Reference in New Issue
Block a user