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)
|
||||
|
||||
if subst.newclofn == nil {
|
||||
// Translate any label on FOR or RANGE loops
|
||||
if m.Op() == ir.OFOR {
|
||||
// Translate any label on FOR, RANGE loops or SWITCH
|
||||
switch m.Op() {
|
||||
case ir.OFOR:
|
||||
m := m.(*ir.ForStmt)
|
||||
m.Label = translateLabel(m.Label)
|
||||
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) {
|
||||
|
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