blob: 2aa1df616dcae347f8cb64fef3eb7a3f9a064e9e [file] [log] [blame]
Russ Cox5963dba2010-04-08 18:15:30 -07001// $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
7package main
8
9import (
10 "runtime"
11 "strings"
Russ Cox5963dba2010-04-08 18:15:30 -070012)
13
14var didbug bool
15
16func bug() {
17 if didbug {
18 return
19 }
20 println("BUG")
21 didbug = true
22}
23
24func 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 Cox8fff9162010-10-25 21:25:13 -070045
Russ Cox5963dba2010-04-08 18:15:30 -070046 f()
47}
48
49func 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 Cox8fff9162010-10-25 21:25:13 -070056 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 Cox5963dba2010-04-08 18:15:30 -070058
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 Cox8fff9162010-10-25 21:25:13 -070067
Russ Cox5963dba2010-04-08 18:15:30 -070068 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 Cox8fff9162010-10-25 21:25:13 -070074type m interface {
75 m()
76}