| // run | |
| // Copyright 2025 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 fff(a []int, b bool, p, q *int) { | |
| outer: | |
| n := a[0] | |
| a = a[1:] | |
| switch n { | |
| case 1: | |
| goto one | |
| case 2: | |
| goto two | |
| case 3: | |
| goto three | |
| case 4: | |
| goto four | |
| } | |
| one: | |
| goto inner | |
| two: | |
| goto outer | |
| three: | |
| goto inner | |
| four: | |
| goto innerSideEntry | |
| inner: | |
| n = a[0] | |
| a = a[1:] | |
| switch n { | |
| case 1: | |
| goto outer | |
| case 2: | |
| goto inner | |
| case 3: | |
| goto innerSideEntry | |
| default: | |
| return | |
| } | |
| innerSideEntry: | |
| n = a[0] | |
| a = a[1:] | |
| switch n { | |
| case 1: | |
| goto outer | |
| case 2: | |
| goto inner | |
| case 3: | |
| goto inner | |
| } | |
| ggg(p, q) | |
| goto inner | |
| } | |
| var b bool | |
| func ggg(p, q *int) { | |
| n := *p + 5 // this +5 ends up in the entry block, well before the *p load | |
| if b { | |
| *q = 0 | |
| } | |
| *p = n | |
| } | |
| func main() { | |
| var x, y int | |
| fff([]int{4, 4, 4}, false, &x, &y) | |
| if x != 5 { | |
| panic(x) | |
| } | |
| } |