From: Ian Lance Taylor Date: Wed, 22 Oct 2014 15:06:15 +0000 (-0700) Subject: test: add more cases to recover.go X-Git-Tag: go1.4beta1~57 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=18051c086012e3ea279994e987ffe826308f93df;p=gostls13.git 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 --- 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) +}