Russ Cox | 5963dba | 2010-04-08 18:15:30 -0700 | [diff] [blame] | 1 | // $G $D/$F.go && $L $F.$A && ./$A.out |
| 2 | |
| 3 | // Copyright 2010 The Go Authors. All rights reserved. |
| 4 | // Use of this source code is governed by a BSD-style |
| 5 | // license that can be found in the LICENSE file. |
| 6 | |
| 7 | package main |
| 8 | |
| 9 | import ( |
| 10 | "runtime" |
| 11 | "strings" |
Russ Cox | 5963dba | 2010-04-08 18:15:30 -0700 | [diff] [blame] | 12 | ) |
| 13 | |
| 14 | var didbug bool |
| 15 | |
| 16 | func bug() { |
| 17 | if didbug { |
| 18 | return |
| 19 | } |
| 20 | println("BUG") |
| 21 | didbug = true |
| 22 | } |
| 23 | |
| 24 | func check(name string, f func(), err string) { |
| 25 | defer func() { |
| 26 | v := recover() |
| 27 | if v == nil { |
| 28 | bug() |
| 29 | println(name, "did not panic") |
| 30 | return |
| 31 | } |
| 32 | runt, ok := v.(runtime.Error) |
| 33 | if !ok { |
| 34 | bug() |
| 35 | println(name, "panicked but not with runtime.Error") |
| 36 | return |
| 37 | } |
| 38 | s := runt.String() |
| 39 | if strings.Index(s, err) < 0 { |
| 40 | bug() |
| 41 | println(name, "panicked with", s, "not", err) |
| 42 | return |
| 43 | } |
| 44 | }() |
Russ Cox | 8fff916 | 2010-10-25 21:25:13 -0700 | [diff] [blame] | 45 | |
Russ Cox | 5963dba | 2010-04-08 18:15:30 -0700 | [diff] [blame] | 46 | f() |
| 47 | } |
| 48 | |
| 49 | func main() { |
| 50 | var x int |
| 51 | var x64 int64 |
| 52 | var p *[10]int |
| 53 | var q *[10000]int |
| 54 | var i int |
| 55 | |
Russ Cox | 8fff916 | 2010-10-25 21:25:13 -0700 | [diff] [blame] | 56 | check("int-div-zero", func() { println(1 / x) }, "integer divide by zero") |
| 57 | check("int64-div-zero", func() { println(1 / x64) }, "integer divide by zero") |
Russ Cox | 5963dba | 2010-04-08 18:15:30 -0700 | [diff] [blame] | 58 | |
| 59 | check("nil-deref", func() { println(p[0]) }, "nil pointer dereference") |
| 60 | check("nil-deref-1", func() { println(p[1]) }, "nil pointer dereference") |
| 61 | check("nil-deref-big", func() { println(q[5000]) }, "nil pointer dereference") |
| 62 | |
| 63 | i = 99999 |
| 64 | var sl []int |
| 65 | check("array-bounds", func() { println(p[i]) }, "index out of range") |
| 66 | check("slice-bounds", func() { println(sl[i]) }, "index out of range") |
Russ Cox | 8fff916 | 2010-10-25 21:25:13 -0700 | [diff] [blame] | 67 | |
Russ Cox | 5963dba | 2010-04-08 18:15:30 -0700 | [diff] [blame] | 68 | var inter interface{} |
| 69 | inter = 1 |
| 70 | check("type-concrete", func() { println(inter.(string)) }, "int, not string") |
| 71 | check("type-interface", func() { println(inter.(m)) }, "missing method m") |
| 72 | } |
| 73 | |
Russ Cox | 8fff916 | 2010-10-25 21:25:13 -0700 | [diff] [blame] | 74 | type m interface { |
| 75 | m() |
| 76 | } |