mirror of https://github.com/golang/go.git
59 lines
1.1 KiB
Go
59 lines
1.1 KiB
Go
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")
|
|
}
|
|
}
|