aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/testdata/testprog
diff options
context:
space:
mode:
authorDamien Neil <dneil@google.com>2025-01-31 15:03:15 -0800
committerDamien Neil <dneil@google.com>2025-02-06 12:02:14 -0800
commit478ad013f90fe1dbb199d22f41b93c920ae0d5e9 (patch)
tree9baaa33c1515d4048dc431d5801aec34e213da1b /src/runtime/testdata/testprog
parent9b4a462a7d85753738723402e298039c3424e584 (diff)
downloadgo-478ad013f90fe1dbb199d22f41b93c920ae0d5e9.tar.xz
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 <mknyszek@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/runtime/testdata/testprog')
-rw-r--r--src/runtime/testdata/testprog/crash.go52
1 files changed, 52 insertions, 0 deletions
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")
+ }()
+}