From 478ad013f90fe1dbb199d22f41b93c920ae0d5e9 Mon Sep 17 00:00:00 2001 From: Damien Neil Date: Fri, 31 Jan 2025 15:03:15 -0800 Subject: runtime: don't duplicate reraised panic values in printpanics Change the output printed when crashing with a reraised panic value to not duplicate that value. Changes output of panicking with "PANIC", recovering, and reraising from: panic: PANIC [recovered] panic: PANIC to: panic: PANIC [recovered, reraised] Fixes #71517 Change-Id: Id59938c4ea0df555b851ffc650fe6f94c0845499 Reviewed-on: https://go-review.googlesource.com/c/go/+/645916 Reviewed-by: Michael Knyszek LUCI-TryBot-Result: Go LUCI --- src/runtime/testdata/testprog/crash.go | 52 ++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'src/runtime/testdata') diff --git a/src/runtime/testdata/testprog/crash.go b/src/runtime/testdata/testprog/crash.go index bdc395f652..56dd701ffb 100644 --- a/src/runtime/testdata/testprog/crash.go +++ b/src/runtime/testdata/testprog/crash.go @@ -19,6 +19,9 @@ func init() { register("StringPanic", StringPanic) register("NilPanic", NilPanic) register("CircularPanic", CircularPanic) + register("ReraisedPanic", ReraisedPanic) + register("ReraisedMiddlePanic", ReraisedMiddlePanic) + register("ReraisedPanicSandwich", ReraisedPanicSandwich) } func test(name string) { @@ -137,3 +140,52 @@ func (e exampleCircleEndError) Error() string { func CircularPanic() { panic(exampleCircleStartError{}) } + +func ReraisedPanic() { + defer func() { + panic(recover()) + }() + panic("message") +} + +func ReraisedMiddlePanic() { + defer func() { + recover() + panic("outer") + }() + func() { + defer func() { + panic(recover()) + }() + func() { + defer func() { + recover() + panic("middle") + }() + panic("inner") + }() + }() +} + +// Panic sandwich: +// +// panic("outer") => +// recovered, panic("inner") => +// panic(recovered outer panic value) +// +// Exercises the edge case where we reraise a panic value, +// but with another panic in the middle. +func ReraisedPanicSandwich() { + var outer any + defer func() { + recover() + panic(outer) + }() + func() { + defer func() { + outer = recover() + panic("inner") + }() + panic("outer") + }() +} -- cgit v1.3