aboutsummaryrefslogtreecommitdiff
path: root/test/recover2.go
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-04-01 22:31:27 -0700
committerRuss Cox <rsc@golang.org>2010-04-01 22:31:27 -0700
commitf75d0d224f1da1781f59bc9e836f8220130747a9 (patch)
tree798bf99d5ad5c793c64312e6730c6e51768e3ed2 /test/recover2.go
parentd6589377c6e48af1990ada22ea47e1bd131c5f62 (diff)
downloadgo-f75d0d224f1da1781f59bc9e836f8220130747a9.tar.gz
go-f75d0d224f1da1781f59bc9e836f8220130747a9.zip
runtime: turn run time errors checks into panics
R=ken2, r CC=golang-dev https://golang.org/cl/871042
Diffstat (limited to 'test/recover2.go')
-rw-r--r--test/recover2.go86
1 files changed, 86 insertions, 0 deletions
diff --git a/test/recover2.go b/test/recover2.go
new file mode 100644
index 0000000000..96d591a15b
--- /dev/null
+++ b/test/recover2.go
@@ -0,0 +1,86 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// Copyright 2010 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.
+
+// Test of recover for run-time errors.
+
+// TODO(rsc):
+// integer divide by zero?
+// null pointer accesses
+
+package main
+
+import (
+ "os"
+ "strings"
+)
+
+var x = make([]byte, 10)
+
+func main() {
+ test1()
+ test2()
+ test3()
+ test4()
+ test5()
+ test6()
+ test7()
+}
+
+func mustRecover(s string) {
+ v := recover()
+ if v == nil {
+ panic("expected panic")
+ }
+ if e := v.(os.Error).String(); strings.Index(e, s) < 0 {
+ panic("want: " + s + "; have: " + e)
+ }
+}
+
+func test1() {
+ defer mustRecover("index")
+ println(x[123])
+}
+
+func test2() {
+ defer mustRecover("slice")
+ println(x[5:15])
+}
+
+func test3() {
+ defer mustRecover("slice")
+ println(x[11:9])
+}
+
+func test4() {
+ defer mustRecover("interface")
+ var x interface{} = 1
+ println(x.(float))
+}
+
+type T struct {
+ a, b int
+}
+
+func test5() {
+ defer mustRecover("uncomparable")
+ var x T
+ var z interface{} = x
+ println(z != z)
+}
+
+func test6() {
+ defer mustRecover("unhashable")
+ var x T
+ var z interface{} = x
+ m := make(map[interface{}]int)
+ m[z] = 1
+}
+
+func test7() {
+ defer mustRecover("complex divide by zero")
+ var x, y complex
+ println(x / y)
+}