1package main
2
3import (
4	"fmt"
5	"runtime"
6)
7
8var failed = false
9
10func checkDivByZero(f func()) (divByZero bool) {
11	defer func() {
12		if r := recover(); r != nil {
13			if e, ok := r.(runtime.Error); ok && e.Error() == "runtime error: integer divide by zero" {
14				divByZero = true
15			}
16		}
17	}()
18	f()
19	return false
20}
21
22//go:noinline
23func a(i uint, s []int) int {
24	return s[i%uint(len(s))]
25}
26
27//go:noinline
28func b(i uint, j uint) uint {
29	return i / j
30}
31
32//go:noinline
33func c(i int) int {
34	return 7 / (i - i)
35}
36
37func main() {
38	if got := checkDivByZero(func() { b(7, 0) }); !got {
39		fmt.Printf("expected div by zero for b(7, 0), got no error\n")
40		failed = true
41	}
42	if got := checkDivByZero(func() { b(7, 7) }); got {
43		fmt.Printf("expected no error for b(7, 7), got div by zero\n")
44		failed = true
45	}
46	if got := checkDivByZero(func() { a(4, nil) }); !got {
47		fmt.Printf("expected div by zero for a(4, nil), got no error\n")
48		failed = true
49	}
50	if got := checkDivByZero(func() { c(5) }); !got {
51		fmt.Printf("expected div by zero for c(5), got no error\n")
52		failed = true
53	}
54
55	if failed {
56		panic("tests failed")
57	}
58}
59