0
1
mirror of https://github.com/golang/go synced 2025-04-12 00:29:42 +00:00
Files
go/test/fixedbugs/issue71675.go

100 lines
1.4 KiB
Go
Raw Normal View History

// 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
//go:noinline
func i() {
for range yieldInts {
defer func() {
println("I")
recover()
}()
}
// This panic causes dead code elimination of the return block.
// The compiler should nonetheless emit a deferreturn.
panic("i panic")
}
//go:noinline
func h() {
defer func() {
println("H first")
}()
for range yieldInts {
defer func() {
println("H second")
}()
}
defer func() {
println("H third")
}()
for range yieldIntsPanic {
defer func() {
println("h recover:called")
recover()
}()
}
}
//go:noinline
func yieldInts(yield func(int) bool) {
if !yield(0) {
return
}
}
//go:noinline
func g() {
defer func() {
println("G first")
}()
for range yieldIntsPanic {
defer func() {
println("g recover:called")
recover()
}()
}
}
//go:noinline
func yieldIntsPanic(yield func(int) bool) {
if !yield(0) {
return
}
panic("yield stop")
}
//go:noinline
func next(i int) int {
if i == 0 {
panic("next stop")
}
return i + 1
}
//go:noinline
func f() {
defer func() {
println("F first")
}()
for i := 0; i < 1; i = next(i) {
defer func() {
println("f recover:called")
recover()
}()
}
}
func main() {
f()
println("f returned")
g()
println("g returned")
h()
println("h returned")
i()
println("i returned")
}