github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/compile/test/testdata/divbyzero_test.go (about)

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