| // 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) |
| } |
| } |