package main
import (
"fmt"
"runtime"
)
var failed = false
func checkDivByZero(f func()) (divByZero bool) {
defer func() {
if r := recover(); r != nil {
if e, ok := r.(runtime.Error); ok && e.Error() == "runtime error: integer divide by zero" {
divByZero = true
}
}
}()
f()
return false
}
//go:noinline
func a(i uint, s []int) int {
return s[i%uint(len(s))]
}
//go:noinline
func b(i uint, j uint) uint {
return i / j
}
//go:noinline
func c(i int) int {
return 7 / (i - i)
}
func main() {
if got := checkDivByZero(func() { b(7, 0) }); !got {
fmt.Printf("expected div by zero for b(7, 0), got no error\n")
failed = true
}
if got := checkDivByZero(func() { b(7, 7) }); got {
fmt.Printf("expected no error for b(7, 7), got div by zero\n")
failed = true
}
if got := checkDivByZero(func() { a(4, nil) }); !got {
fmt.Printf("expected div by zero for a(4, nil), got no error\n")
failed = true
}
if got := checkDivByZero(func() { c(5) }); !got {
fmt.Printf("expected div by zero for c(5), got no error\n")
failed = true
}
if failed {
panic("tests failed")
}
}