diff options
author | Ian Lance Taylor <iant@golang.org> | 2014-10-22 08:06:15 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2014-10-22 08:06:15 -0700 |
commit | 18051c086012e3ea279994e987ffe826308f93df (patch) | |
tree | 8351aaaccb47436a8d80efab12c1290dd8be2389 /test/recover.go | |
parent | ecd1cc173aed7360ce1c9e7454e5b0b548728c18 (diff) | |
download | go-18051c086012e3ea279994e987ffe826308f93df.tar.gz go-18051c086012e3ea279994e987ffe826308f93df.zip |
test: add more cases to recover.go
test16 used to fail with gccgo. The withoutRecoverRecursive
test would have failed in some possible implementations.
LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/151630043
Diffstat (limited to 'test/recover.go')
-rw-r--r-- | test/recover.go | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/test/recover.go b/test/recover.go index 6287d65076..f92c15c1d6 100644 --- a/test/recover.go +++ b/test/recover.go @@ -63,6 +63,7 @@ func main() { test14reflect1() test14reflect2() test15() + test16() } } @@ -114,10 +115,23 @@ func withoutRecover() { mustNotRecover() // because it's a sub-call } +func withoutRecoverRecursive(n int) { + if n == 0 { + withoutRecoverRecursive(1) + } else { + v := recover() + if v != nil { + println("spurious recover (recursive)", v) + die() + } + } +} + func test1() { - defer mustNotRecover() // because mustRecover will squelch it - defer mustRecover(1) // because of panic below - defer withoutRecover() // should be no-op, leaving for mustRecover to find + defer mustNotRecover() // because mustRecover will squelch it + defer mustRecover(1) // because of panic below + defer withoutRecover() // should be no-op, leaving for mustRecover to find + defer withoutRecoverRecursive(0) // ditto panic(1) } @@ -547,3 +561,27 @@ func test15() { defer f() panic(15) } + +func reflectFunc2(args []reflect.Value) (results []reflect.Value) { + // This will call reflectFunc3 + args[0].Interface().(func())() + return nil +} + +func reflectFunc3(args []reflect.Value) (results []reflect.Value) { + if v := recover(); v != nil { + println("spurious recover", v) + die() + } + return nil +} + +func test16() { + defer mustRecover(16) + + f2 := reflect.MakeFunc(reflect.TypeOf((func(func()))(nil)), reflectFunc2).Interface().(func(func())) + f3 := reflect.MakeFunc(reflect.TypeOf((func())(nil)), reflectFunc3).Interface().(func()) + defer f2(f3) + + panic(16) +} |